Я думаю, легче понять, если быть конкретным.Рассмотрим:
Pet myPet = new Dog();
против:
Pet myPet = new Cat();
Какая разница?Если все, что вы знаете о своем питомце, это то, что это Pet
, то вы не знаете, что именно произойдет, если вы позвоните:
myPet.beHappy();
В первом случае, возможно, будет реализовано beHappy()
как this.wagTail();
, тогда как во втором случае это может быть this.purr();
.
Теперь вернитесь к исходному описанию и замените конкретные классы: «Я бы хотел питомца, но яхочу, чтобы он вел себя как собака [или кошка] за то, что он счастлив ». Будь это точное описание происходящего, я думаю, зависит от вашей перспективы.Конечно, у вас есть объект Pet
, который ведет себя как объект Dog
(или Cat
).С другой стороны, можно было бы сказать: «Я бы хотел Собаку, но я хочу взаимодействовать с ней так же, как и с любым другим домашним животным». Это также правильное описание того, чтопроисходит.
Какое описание подходит?Они оба.Что предпочтительнее?Это просто зависит от того, с какой стороны оператора присваивания вы начинаете.