«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использование ссылки на суперкласс для объекта подкласса

Использование ссылки на суперкласс для объекта подкласса

Опубликовано 19 ноября 2024 г.
Просматривать:902

Using a Superclass Reference for a Subclass Object

Рассмотрим сценарий, в котором мы создаем класс с именем User, а затем создаем подкласс, расширяющий User, с именем Employee.
Обычно мы создаем экземпляр User с помощью:

User user = new User();

Здесь User — это тип переменной user, user — это переменная, содержащая экземпляр класса, а new User() создает новый экземпляр User.
Проще говоря, пользователь является экземпляром User.


Но что, если суперклассу Пользователь необходимо использовать методы, определенные в его подклассе Сотрудник? Может ли такое случиться?
Короткий ответ: да, но только для переопределенных методов (методов, которые существуют как в суперклассе, так и в подклассе). Это то, что обеспечивает полиморфизм.
Поскольку отношением наследования является отношение "является", Сотрудник является пользователем. поэтому ничто не мешает Пользователю хранить ссылку на экземпляр своего подкласса Сотрудник, если это совместимый тип.

Это делается следующим образом:

User user = new Employee();

Теперь предположим, что класс User имеет два метода:

  1. getUserName()
  2. getUserSalary().

в то время как класс Сотрудника имеет дополнительный метод getEmployeeInformation(), который переопределяет метод getUserSalary().

THen с пользователем user = новый сотрудник();:

  1. user.getUserName() будет работать так, как определено в классе User.

  2. user.getUserSalary() также будет работать, но выходные данные будут получены из переопределенного метода getUserSalary() в классе Employee, а не из метода в User . В этом суть полиморфизма.

  3. user.getEmployeeInformation() не будет работать. Это выдаст ошибку компиляции, поскольку она характерна для класса Employee.

Ошибка компиляции возникает, когда компилятор обнаруживает такие проблемы, как синтаксические ошибки, несоответствия типов или другие нарушения, которые препятствуют успешной компиляции кода.

Если мы попытаемся сделать обратное и ссылаться на объект подкласса Сотрудник со ссылкой на суперкласс Пользователь, это не будет работать без ручного приведения! Для этого требуется явное приведение типов, поскольку Пользователь не обязательно является Сотрудником.


Апкастинг VS. Даункастинг

После простого объяснения на простом примере давайте сосредоточимся на терминах.

"Ссылка суперкласса на объект подкласса" обычно называется восходящим преобразованием. Проще говоря, повышающее приведение — это приведение типа дочернего объекта к родительскому, и это происходит неявно (означает, что компилятор обрабатывает его автоматически, поэтому нам не нужен какой-либо специальный синтаксис приведения). Это похоже на то, как мы делали User user = новый сотрудник();.

А как насчет понижающего кастинга?

Понижающее преобразование является полной противоположностью повышающему.

Помните, мы говорили, что создание ссылки Сотрудник из экземпляра пользователя недействительно? Это называется нисходящим приведением и должно выполняться явно с использованием синтаксиса приведения. Хотя повышающее приведение очень безопасно, понижающее сопряжено с риском. Это не значит, что он бесполезен, но его следует использовать с осторожностью.

Я не буду вдаваться в подробности о понижающем приведении, так как эта статья посвящена повышающему приведению, но ключевым моментом является показ основного различия между понижающим и повышающим.


И это конец! :)

Заявление о выпуске Эта статья воспроизводится по адресу: https://dev.to/khaledsalshibani/using-a-superclass-reference-for-a-subclass-object-22ga?1 Если есть какое-либо нарушение, пожалуйста, свяжитесь с учебой[email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3