Большая разница. Разница в контексте. Разница в общности. Позвольте мне привести простой пример
public class Animal {
...
}
и
public class Dog : Animal {
...
}
, а затем, если у вас есть Animal dog = new Dog();
, который не предоставляет (в области времени компиляции) какие-либо дополнительные свойства, собака имеет над животным. Ваша «собака» - это просто животное, и с ним нужно обращаться. например, в intellisense auto complete ничего дополнительного не появится. Все, что вы хотите «знать», когда используете этот объект, ограничивается тем, что он является животным. если у вас есть Dog dog = new Dog();
, который вы хотите (в области времени компиляции) рассматривать как собаку. Это покажет его полную функциональность и свойства. У собаки есть хвост, а у животного нет, например. Вы хотите использовать свойство tail в своем коде?
Также предположим, что у вас есть DogTender
с методом TakeCareOfDog(Dog myDoggy)
. Если вы указали Animal dog = new Dog (); хорошо, чем пример DogTender не может справиться с вашей собакой (потому что это не собака. Это животное). Тем не менее, ваше животное может хорошо вписаться в AnimalCollection
(например, Zoo
). Мы называем это принципом Лисков или Принцип замещения - классы-потомки говорят своему базовому классу - "все, что вы можете сделать, я могу сделать лучше". Все, что может сделать животное, может делать и собака, но не наоборот.