Если у вас есть List<A>
, вы можете использовать его для каждого класса типа A
и всех производных классов.Давайте перенесем это в реальный мир:
Если у вас есть определение Vehicle
(это ваше A
).Вы могли бы написать программное обеспечение для компании по прокату автомобилей, которая обрабатывает транспортные средства.У них есть все виды транспортных средств, таких как один или несколько велосипедов (это B
) и один или несколько автомобилей (это C
).Оба очень разные, но оба являются транспортными средствами.
Используя абстракцию Vehicle
(A
), вы можете хранить велосипеды и автомобили в одном контексте.
Таким образом, в List<Vehicle>
вы можете хранить велосипеды, автомобили, грузовики и все виды передвижных вещей.Тем не менее, определение Vehicle
будет иметь наименьший общий знаменатель, такой как тип двигателя, количество дверей и т. Д. Но вы (надеюсь) не найдете в этом определении транспортных средств специфических свойств, которые могут не подходить для других, таких каквелосипед или автомобиль.
Отслеживание велосипедов и автомобилей в качестве транспортных средств вообще не снимает поля.Тем не менее, они рассматриваются как транспортные средства, поэтому вы не увидите конкретные свойства, пока не приведете каждое транспортное средство к его реальному типу.Есть несколько подходов к этому, я хотел бы выделить Pattern Matching в C # 7, что делает его действительно простым сейчас.
foreach (var v in vehicleList)
{
switch (v)
{
case Bike b:
// ... do bike specific things
break;
case Car c:
// ... do car specific things
break;
case Truck t:
// ... do truck specific things
break;
default:
WriteLine("<unknown>");
break;
}
}