使用更指定的返回类型(协方差)重写抽象属性

本文关键字:方差 重写 属性 抽象 返回类型 | 更新日期: 2023-09-27 18:11:17

class Base {}
abstract class A
{
    abstract public List<Base> Items { get; set; }
}
class Derived : Base {}
class B : A
{ 
    private List<Derived> items;
    public override List<Derived> Items
    {
           get
           {
               return items;
           }
           set
           {
            items = value;
           }
      }
  }

编译器说B.Items必须是基本元素的List,"以匹配覆盖的成员"A.Items。我怎样才能做到呢?

使用更指定的返回类型(协方差)重写抽象属性

您最初尝试完成的是不可能的- . net不支持方法重载的co(contra)方差。属性也是一样,因为属性就是一对方法。

但是你可以让你的类泛型:

class Base {}
abstract class A<T> 
    where T : Base
{
    abstract public List<T> Items { get; set; }
}
class Derived : Base {}
class B : A<Derived>
{ 
    private List<Derived> items;
    public override List<Derived> Items
    {
           get
           {
               return items;
           }
           set
           {
            items = value;
           }
      }
  }