Зачем использовать другой тип и конструктор при создании экземпляра класса? - PullRequest
1 голос
/ 19 февраля 2020

Предположим, у нас есть класс ProductA, который унаследовал другой класс с именем Product. В чем смысл

Product product = new ProductA();

И в чем разница между этим и

ProductA product = new ProductA();

Ответы [ 3 ]

3 голосов
/ 19 февраля 2020

Нет разницы в том, какой экземпляр создается, но есть разница. В первом примере вы можете получить доступ только к членам, определенным Product.

Это похоже на следующее.

object x1 = "hello";
string x2 = "hello";

В обоих случаях создается экземпляр строки, но вы можете вызвать .Length на x2, но не на x1.

3 голосов
/ 19 февраля 2020

При инициализации без разницы. Это все равно, что сказать "ProductA - это вещь Product типа".

В объектно-ориентированном программировании концепция IS-A основана на наследовании, которое может быть двух типов: наследование класса или наследование интерфейса.

Тогда при каких обстоятельствах эти два синтаксиса могут иметь разницу?

Зачем использовать полиморфизм?

Почему и когда используется полиморфизм?

Дополнительное чтение: Разница между виртуальным, переопределенным, новым и запечатанным переопределением

1 голос
/ 19 февраля 2020

Большая разница. Разница в контексте. Разница в общности. Позвольте мне привести простой пример

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). Мы называем это принципом Лисков или Принцип замещения - классы-потомки говорят своему базовому классу - "все, что вы можете сделать, я могу сделать лучше". Все, что может сделать животное, может делать и собака, но не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...