2015-02-04 5 views
-1

У меня есть базовый абстрактный класс и производный классВозврата производного типа, когда возвращаемый тип базового типа C#

Базовых абстрактный класс

public abstract class BaseData: IListingData 
    { 
     private int? _photos; 
     public string DataKey { get; set; } 
     public abstract List<Images> Photos { get; set; } 
} 

производного класс

public class DerivedData1 : BaseData 
    { 
     public override List<Images> Photos 
     { 
      get 
      { return new List<Images>(); } set {} 
     } 
    } 

public class DerivedData2 : BaseData 
     { 
      public override List<Images> Photos 
      { 
       get 
       { return new List<Images>(); } set {} 
      } 
     } 

У меня есть службы функции:

public List<ListingData> FilterListings(PredicateHandler predicates) 
     { 
      //Retrieved from database and based on certain predicates, it will create List of DerivedData1 or DerivedData2 

      Return new List<DerivedData1>(); //This is where the ERROR is. 
     } 

Я не могу вернуть Derived Type. Я попробовал кастинг, и я получил следующую ошибку компиляции. Невозможно преобразовать тип выражения «System.Collections.Generic.List < DerivedData1>» для возврата типа «System.Collections.Generic.List < ListingData>»

Я также попытался изменить тип возвращаемого значения функции службы FilterListings() к интерфейсу IListingData, но я все еще сталкиваюсь с ошибкой кастинга.

Я искал на других сообщениях Stackoverflow. Что отвечает на вопросы о возврате производного типа из базового класса. Но я думаю, что это другой сценарий.

Нижняя линия, Моя сервисная функция класса имеет тип возвращаемого Animal() и из внутри функции, я хочу, чтобы вернуть Dog()

Что мне не хватает?

+0

Прочитайте это: https://msdn.microsoft.com/en-us/library/vstudio/dd799517%28v=vs.100%29.aspx –

ответ

-1

Я бы использовал List<object>, если бы я был на вашем месте, и наложил object на все, что необходимо при итерации (например). Ваша проблема заключается в том, что List<Base> и List<DerivedFromBase> считаются несвязанными (что является предполагаемым поведением, даже если оно неудобно).

0

В вашем примере кода вы не можете вернуть новый список DerivedData1, где возвращаемый тип функции - List of ListingData. Причина в том, что между двумя типами списков нет иерархических отношений. Что вы можете сделать, это:

public List<ListingData> FilterListings(PredicateHandler predicates) 
     { 
      var list = new List<BaseData>(); 
      var list.Add(new DerivedData1()); 
      var list.Add(new DerivedData2()); 

      return list; 
     } 
Смежные вопросы