Interested Article - Переопределение метода
- 2020-04-27
- 2
Переопределение метода ( англ. Method overriding ) в объектно-ориентированном программировании — одна из возможностей языка программирования , позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода , уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса . Версия метода, которая будет исполняться, определяется объектом , используемым для его вызова. Если вызов метода происходит от объекта родительского класса, то выполняется версия метода родительского класса, если же объект подкласса вызывает метод, то выполняется версия дочернего класса . Некоторые языки программирования позволяют программисту защищать методы от переопределения.
Примеры
Java
В языке программирования
Java
, когда подкласс содержит метод, переопределяющий метод суперкласса, то он может помимо своего метода вызывать и метод суперкласса при помощи
ключевого слова
super
.
Пример:
public class Thought {
public void message() {
System.out.println("Я себя чувствую как стрекоза, попавшая в параллельную вселенную.");
}
}
public class Advice extends Thought {
@Override // Аннотация @Override в Java 5 является необязательной, но весьма полезной
public void message() {
System.out.println("Внимание: Даты в календаре ближе, чем кажутся!");
}
}
Класс
Thought
представляет собой суперкласс и обеспечивает вызов метода
message()
. Подкласс, называемый
Advice
, наследует каждый метод класса
Thought
. Однако, класс
Advice
переопределяет метод
message()
, замещая функциональность, описанную в классе
Thought
.
Thought t1 = null;
t1 = new Thought();
t1.message(); // Выводит "Я себя чувствую как стрекоза, попавшая в параллельную вселенную."
t1 = new Advice(); // Полиморфизм
t1.message(); // Выводит "Внимание: Даты в календаре ближе, чем кажутся."
Слово
super
используется для вызова версии метода суперкласса из подкласса. Например, нижеследующий вариант выводит оба сообщения при вызове метода подкласса:
public class Advice extends Thought {
@Override
public void message() {
System.out.println("Внимание: Даты в календаре ближе, чем кажутся.");
super.message(); // Вызов версии метода родительского класса
}
}
Невозможно для класса, объявленного как
final
, стать суперклассом
.
C++
В языке
C++
отсутствует ключевое слово
super
, которое подклассы в языке Java используют для вызова версии метода суперкласса вместо переопределенной. Вместо этого, перед именем родительского или базового класса используется
. Например, нижеследующий код оперирует двумя
классами
: базовым классом
Rectangle
и производным классом
Box
.
Box
перекроет метод
print()
класса
Rectangle
, благодаря чему он печатает его высоту.
class Rectangle
{
public:
virtual void print() const;
private:
double length;
double width;
};
void Rectangle::print() // метод print() базового класса
{
cout << "Length = " << length << "; Width = " << width;
}
class Box : public Rectangle
{
public:
void print() const;
private:
double height;
};
void Box::print() // метод print() производного класса
{
Rectangle::print(); // вызов родительского метода print()
cout << "; Height= " << height;
}
Метод
print()
в классе
Box
вызывается родительская версия метода
print()
, также способная выводить значение private-
переменных
length
и
width
базового класса. В других случаях эти переменные недоступны для
Box
.
Следующие
инструкции
порождают
объекты с типом
Rectangle
и
Box
и соответственно вызывают их методы
print()
:
Rectangle myRectangle(5.0, 3.0);
myRectangle.print();
// outputs:
// Length = 5.0; Width = 3.0
Box myBox(6.0, 5.0, 4.0);
myBox.print();
// outputs:
// Length = 6.0; Width = 5.0; Height = 4.0
Примечания
- Flanagan 2002, стр. 107
- ↑ Lewis & Loftus 2006, стр.454
- Deitel & Deitel 2001, стр.474
- Malik 2006, стр.676
Литература
- Deitel, H. M & Deitel, P. J.(2001). Java How to Program (4th ed.). Upper Saddle River, NJ: Prentice Hall.
- Lewis, J. & Loftus, W. (2008). Java: Software Solutions (6th ed.). Boston, MA: Pearson Addison Wesley.
- Malik, D. S.(2006). C++ Programming: Program Design Including Data Structure. (3rd ed.). Washington, DC: Course Technology.
- Flanagan, David.(2002). Java in a Nutshell .
См. также
- Перегрузка процедур и функций
- Наследование (программирование)
- Принцип подстановки Барбары Лисков
- Виртуальное наследование
- Шаблонный метод (шаблон проектирования)
- Полиморфизм в объектно-ориентированном программировании
Ссылки
- (англ.)
- (англ.)
- (англ.) от Sun Microsystems
- 2020-04-27
- 2