Переопределение абстрактного свойства с использованием более точного возвращаемого типа (ковариация)

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 должен быть списком базовых элементов, «чтобы соответствовать переопределенному члену» A.Items. Как я могу заставить это работать?


person Jules Bianqi    schedule 03.07.2014    source источник


Ответы (1)


То, что вы пытались выполнить изначально, невозможно - .NET не поддерживает со(противо)вариантность для перегрузки метода. То же самое касается свойств, потому что свойства — это просто пара методов.

Но вы можете сделать свои классы универсальными:

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;
           }
      }
  }
person Eugene Podskal    schedule 03.07.2014
comment
но вы можете использовать ковариацию только для свойств set или only-get. - person Dei Revoledo; 23.08.2017