Полезным правилом для размышлений об иерархиях типов является принцип подстановки Лискова .В основном, это говорит о том, что A, являющийся подтипом B, означает, что вы можете использовать A везде, где вы можете использовать B. Обычно это не так.
Например, скажем, язлой король, который требует от своих подданных дань в виде куска Fruit
.Можете ли вы принести мне экземпляр Apple
?Да, конечно.Так что яблоко - это подтип фруктов.За горами есть другой злой король , который требует дани от своих подданных в виде Apple
s.Можете ли вы принести ему Banana
или какой-нибудь другой кусок Fruit
?Нет!Он сделает так, чтобы тебя растоптали до смерти пони.
Итак, чтобы прожить долгую и счастливую жизнь в моем королевстве, вам понадобится запас Fruit
.Вы можете хранить этот запас в List
.Не могли бы вы сохранить его в List<Fruit>
?Да, без проблем.Как насчет List<Apple>
?Хорошо, потому что я приму Apple
с.Таким образом, для целей производство , List<Apple>
является подтипом List<Fruit>
.Конечно, над горами в земле другого злого короля вы можете получить только List<Apple>
, если только вы не хотите тратить много времени на приведение содержимого от List<Fruit>
к Apple
с, что, если только выВолшебник довольно утомительный.
Теперь, после каждого дня дани, у меня есть гора фруктов.Я даже не люблю фрукты, поэтому я должен положить их куда-нибудь.Очевидное место - List<Fruit>
.Могу ли я вместо этого использовать List<Apple>
здесь?Нет!Потому что некоторые из моих дорогих предметов могут принести мне Banana
с, и я не смог бы поместить их в такой список.Однако над горами складывается иная ситуация.Злобный король интересуется только Apple
с, поэтому он может с радостью использовать List<Apple>
для хранения своего питательного запаса.Но может ли он использовать List<Fruit>
?Да!Поскольку Apple
- это Fruit
, поэтому он может довольно легко поместить их в такой список.Это будет странно, когда он захочет вытащить их снова, но он может положить их довольно счастливо.Итак, с целью потребления мы видим, что кто-то, кто может использовать List<Apple>
, может также использовать List<Fruit>
, и поэтому мы имеем обратную ситуацию, что List<Fruit>
является подтипом List<Apple>
.Вот почему я не перехожу в другое злое царство.Забавное место.
Тем не менее, это лучше, чем Республика Хаскель.