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

Переопределение метода ( англ. 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

Примечания

  1. Flanagan 2002, стр. 107
  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 .

См. также

Ссылки

Источник —

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