Допустим у меня есть следующие классы:
class NonPlayerCharacter {
}
class Traider : NonPlayerCharacter {
}
В чем будет разница между
Traider sidorovich = new Traider ();
И
NonPlayerCharacter sidorovich = new Traider();
Так же хотел спросить про приведение типов. Если я создам объект
NonPlayerCharacter sidorovich = new NonPlayerCharacter();
То могу я его потом привести к типу Traider и получить функционал этого класса? Спасибо за ответ
C#
C# разница между созданием объекта родительского и производного класса.
В первом случае ты работаешь с sidorovich как с Traider - сразу имея доступ ко всем публичным полям и методам Traider.
Во втором случае хотя объект и имеет тип Trider, но ты имеешь доступ только к публичным полям и классам NonPlayerCharacter. Чтобы получить доступ к полям и методам Trider, отсутствующим в NonPlayerCharacter, необходимо сделать явное приведение sidorovich к типу Traider.
Нет, приведение объекта new NonPlayerCharacter() и типу Traider невозможно.
Во втором случае хотя объект и имеет тип Trider, но ты имеешь доступ только к публичным полям и классам NonPlayerCharacter. Чтобы получить доступ к полям и методам Trider, отсутствующим в NonPlayerCharacter, необходимо сделать явное приведение sidorovich к типу Traider.
Нет, приведение объекта new NonPlayerCharacter() и типу Traider невозможно.
>В чем будет разница между
Принципиально - ни в чем. И то, и другое создаст пару указателей и адью. Но для того, чтобы воспользоваться методами 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. Поэтому перед приведением типов следует убедиться в корректности приведения.
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
Похожие вопросы
- C# создание экземпляра класса с вложенным классом
- Зачем разбивать код в C# на отдельные классы?
- Базовые классы C# Нужен код такой большой
- Можете объяснить по постому про создание классов?
- Как исправить ошибку ссылка на объект c# winforms
- Почему объекты в C# такие монструозные - каким принципам следовала Майкрософт при их дизайне, и будет ли лучше?
- Стоит ли дальше учить C#?
- Программирование на C Sharp (C#)
- Сегодня начал учить c#, решил сделать калькулятор простой и столкнулся с такой ошибкой при компиляции, хелпуйте.
- Что лучше C# или C++?
NPC sidorovich = new Traider
Если можно объявить его сразу с типом Traider, чтобы не выполнять в дальнейшем преобразования