Принятый ответ правильный (исключая тот факт, что он цитирует неправильный раздел спецификации), но он объясняет вещи с точки зрения спецификации, а не дает обоснование , почему спецификация хороша.
Предположим, у нас есть базовый класс B и производный класс D. В B есть метод M, который принимает Giraffe.Теперь, помните, по предположению, автор D знает все о публичных и защищенных членах B .Другими словами, автор D должен знать на больше , чем автор B, потому что D был написан после B , а D был написан для расширения B до сценария, неуже обработано B .Поэтому мы должны полагать, что автор D выполняет лучше работу по реализации всех функциональных возможностей D, чем автор B.
Если автор D делаетперегрузка M, которая берет Животное, они говорят Я знаю лучше чем автор B, как обращаться с Животными, и это включает Жирафов .Мы должны ожидать разрешения перегрузки, когда при вызове DM (Giraffe) вызывается DM (Animal), а не BM (Giraffe).
Давайте скажем иначе: нам дано два возможных оправдания:
- Звонок в DM (Жираф) должен идти к BM (Жираф), потому что Жираф более специфичен, чем Животное
- Звонок в DM (Жираф) должен идти к DM (Животное), потому что Dболее конкретен, чем B
Оба обоснования имеют отношение специфичность , так какое же из этих обоснований лучше? Мы не вызываем никаких методов для Animal !Мы вызываем метод на D, поэтому , чтобы победила специфика .Специфика приемника намного, гораздо важнее, чем специфичность любого из его параметров. Существуют типы параметров для разрыва связи .Важно убедиться, что мы выбрали самый конкретный получатель , потому что этот метод был написан позже кем-то, кто больше знает сценарий, который D должен обрабатывать .
Теперь вы можете сказать, что, если автор D также переопределил BM (Жираф)?Есть два аргумента, почему вызов DM (Жираф) должен вызывать DM (Животное) в этом случае.
Первый , автор D должен знать, что DM (Животное) можно вызвать с Жирафом , и это должно быть написано, чтобы сделать правильную вещь .Таким образом, с точки зрения пользователя не должно иметь значения, разрешен ли вызов в DM (Animal) или BM (Giraffe), потому что D был написан правильно, чтобы делать правильные вещи.
Второй , если автор D переопределил метод B или нет, является деталью реализации D, а не частью публичной поверхностирайон .Другими словами: было бы очень странно, если изменило бы, был ли переопределен метод изменило , какой метод выбран .Представьте, что вы вызываете метод какого-то базового класса в одной версии, а затем в следующей версии автор базового класса вносит незначительные изменения в то, переопределен ли метод или нет;вы не ожидаете изменения разрешения перегрузки в производном классе .C # был тщательно спроектирован, чтобы предотвратить подобные ошибки.