C#

C# разница между созданием объекта родительского и производного класса.

Допустим у меня есть следующие классы:

class NonPlayerCharacter {
}

class Traider : NonPlayerCharacter {
}

В чем будет разница между
Traider sidorovich = new Traider ();
И
NonPlayerCharacter sidorovich = new Traider();

Так же хотел спросить про приведение типов. Если я создам объект
NonPlayerCharacter sidorovich = new NonPlayerCharacter();
То могу я его потом привести к типу Traider и получить функционал этого класса? Спасибо за ответ
В первом случае ты работаешь с sidorovich как с Traider - сразу имея доступ ко всем публичным полям и методам Traider.

Во втором случае хотя объект и имеет тип Trider, но ты имеешь доступ только к публичным полям и классам NonPlayerCharacter. Чтобы получить доступ к полям и методам Trider, отсутствующим в NonPlayerCharacter, необходимо сделать явное приведение sidorovich к типу Traider.

Нет, приведение объекта new NonPlayerCharacter() и типу Traider невозможно.
Олег Духнич
Олег Духнич
90 751
Лучший ответ
>В чем будет разница между
Принципиально - ни в чем. И то, и другое создаст пару указателей и адью. Но для того, чтобы воспользоваться методами Traider, Сидоровичу придется себя сначала привести к этому типу.

>То могу я его потом привести к типу
Хе-хе. Можешь попытаться (например, используя динамическое приведение), и у тебя даже программа скомпилируется. Но при попытке это провернуть будет исключение.
Рябинина Людмила А есть ли вообще тогда смысл создавать объект так? :
NPC sidorovich = new Traider
Если можно объявить его сразу с типом Traider, чтобы не выполнять в дальнейшем преобразования
В первом случае:
Traider sidorovich = new Traider();


Во втором случае:
NonPlayerCharacter sidorovich = new Traider();

Вы создаете объект типа Traider, но присваиваете его переменной sidorovich типа NonPlayerCharacter. В этом случае переменная sidorovich будет иметь доступ только к функционалу класса NonPlayerCharacter, даже если она содержит объект класса Traider. Вы сможете вызывать только методы и обращаться только к свойствам, которые определены в классе NonPlayerCharacter.

Относительно приведения типов, если вы создали объект типа NonPlayerCharacter, то его нельзя просто так привести к типу Traider, потому что объект был создан как NonPlayerCharacter и не имеет дополнительной информации, связанной с типом Traider. Если вы уверены, что объект NonPlayerCharacter на самом деле является объектом Traider, то вы можете использовать операцию явного приведения типов для получения доступа к функционалу класса Traider, например:

NonPlayerCharacter sidorovich = new Traider();
Traider traiderSidorovich = (Traider)sidorovich;
Однако, если объект NonPlayerCharacter на самом деле не является объектом Traider, это вызовет исключение InvalidCastException. Поэтому перед приведением типов следует убедиться в корректности приведения.
Рябинина Людмила Вроде понял, спасибо) Пойду в компиляторе поиграюсь, чтоб закрепить xd