Переопределение метода

Переопределение метода

Переопределение метода (англ. Method overriding) в объектно-ориентированном программировании — одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса[1]. Версия метода, которая будет исполнятся, определяется объектом, используемым для его вызова. Если вызов метода происходит от объекта родительского класса, то выполняется версия метода родительского класса, если же объект подкласса вызывает метод, то выполняется версия дочернего класса[2]. Некоторые языки программирования позволяют программисту защищать методы от переопределения.

Содержание

Примеры

Java

В языке программирования Java, когда подкласс содержит метод, переопределяющий метод суперкласса, то он может помимо своего метода вызывать и метод суперкласса при помощи ключевого слова super [2]. Пример:

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 parking = new Thought();
parking.message();  // Выводит "Я себя чувствую как стрекоза, попавшая в параллельную вселенную."
 
Thought dates = new Advice();  // Полиморфизм
dates.message();  // Выводит "Внимание: Даты в календаре ближе, чем кажутся."

Слово super используется для вызова версии метода суперкласса из подкласса. Например, нижеследующий вариант выводит оба сообщения при вызове метода подкласса:

public class Advice extends Thought {
      @Override
      public void message() {
          System.out.println("Внимание: Даты в календаре ближе, чем кажутся.");
          super.message();  // Вызов версии метода родительского класса
      }
  }

Существуют методы, которые подкласс не может переопределять. Например, в Java метод, объявленный с ключевым словом final, не может быть переопределён. Методы, объявленные как private или static не могут быть переопределены, поскольку это соответствует неявному использованию final. Также это невозможно для класса, объявленного как final, стать суперклассом[3].

C++

В языке C++ отсутствует ключевое слово super, которое подклассы в языке Java используют для вызова версии метода суперкласса вместо переопределенной. Вместо этого, перед именем родительского или базового класса используется оператор области видимости. Например, нижеследующий код оперирует двумя классами: базовым классом Rectangle и производным классом Box. Box переопределяет метод print() класса Rectangle, благодаря чему он печатает его высоту.[4]

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

Примечания

  1. Flanagan 2002, стр. 107
  2. 1 2 Lewis & Loftus 2006, стр.454
  3. Deitel & Deitel 2001, стр.474
  4. 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.

См. также

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "Переопределение метода" в других словарях:

  • Monkey (язык программирования) — У этого термина существуют и другие значения, см. Monkey. Monkey  язык программирования, предназначенный для разработки игр на различных платформах, включая настольный компьютер, мобильные и игровые консоли. Сам по себе, язык является… …   Википедия

  • Таблица виртуальных методов — (англ. virtual method table, VMT) координирующая таблица или vtable механизм, используемый в языках программирования для поддержки динамического соответствия (или метода позднего связывания). Допустим, программа содержит несколько классов в… …   Википедия

  • VMT — Таблица виртуальных методов (англ. virtual method table, VMT) координирующая таблица или vtable механизм, используемый в языках программирования для поддержки динамического соответствия (или метода позднего связывания). Допустим, программа… …   Википедия

  • Virtual function table — Таблица виртуальных методов (англ. virtual method table, VMT) координирующая таблица или vtable механизм, используемый в языках программирования для поддержки динамического соответствия (или метода позднего связывания). Допустим, программа… …   Википедия

  • Vtable — Таблица виртуальных методов (англ. virtual method table, VMT) координирующая таблица или vtable механизм, используемый в языках программирования для поддержки динамического соответствия (или метода позднего связывания). Допустим, программа… …   Википедия

  • Перегрузка процедур и функций — У этого термина существуют и другие значения, см. Перегрузка. Перегрузка процедур и функций  возможность использования одноимённых подпрограмм: процедур или функций в языках программирования. Содержание 1 Причина появления 2 Реализация …   Википедия

  • Оберон (язык программирования) — У этого термина существуют и другие значения, см. Оберон. Oberon Класс языка: императивный, структурированный, модульный Появился в: 1986 Автор(ы) …   Википедия

  • Оберон-2 — Оберон  язык программирования высокого уровня, разработанный Никлаусом Виртом, а также одноимённая операционная система, разработанная Виртом и Юргом Гуткнехтом. Это также родовое имя для всего семейства близкородственных языков, производных от… …   Википедия

  • Синтаксический сахар — Эта статья нуждается в дополнительных источниках для улучшения проверяемости. Вы можете помочь улучшить эту статью, добавив ссы …   Википедия

  • Ruby — Класс языка: мультипарадигмальный: динамический, объектно ориентиров …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»