Я верю, что вы хотите использовать дженерики:
public class BaseClass<T> where T: BaseItem, new()
{
public List<T> items;
protected BaseClass()
{
items = new List<T>();
T item = new T();
item.SomePropertyOfBaseItem=something;
items.Add(item);
}
}
public class DerivedClass: BaseClass<DerivedItem>
Это приведет к тому, что items
in DerivedClass
будет List<DerivedItem>
. where
обеспечивает использование только типов, производных от BaseItem
.
edit : "downcasting", приведение типа к производному типу, на самом деле не то, что вы пытаетесь сделать здесь. Ваше намерение состоит в том, чтобы объекты производного списка использовали определенный тип производного элемента в соответствии с дизайном, и, вероятно, вы хотите хранить экземпляры объектов производного типа в вашем классе производного списка.
Таким образом, это может работать просто отлично без использования шаблонов: List<BaseItem>
прекрасно способен хранить любые элементы, которые происходят от BaseItem
. Однако вам нужно будет ссылаться на эти объекты из списка, используя приведение (как описано в других ответах), чтобы получить доступ к производным свойствам. Но это просто «приведение» объекта к его истинному типу. Обобщения дают вам возможность предоставить строго типизированный доступ к этим объектам напрямую.
По сути, сохранение объекта в контейнере, который является суперклассом объекта, ничего не меняет в объекте - он только меняет способ, которым ваш код может ссылаться на него, делая его более простым типом, из которого это выводится.