Заміщення методу

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Заміщення методу (англ. Method overriding, інколи помилково перекладають як перевизначення методу) в об'єктно-орієнтованому програмування — це можливість мови програмування, що дозволяє підкласу або дочірньому класу надавати специфічну реалізацію методу, що вже реалізований в одному із суперкласів[1]. Реалізація методу в підкласі заміщає реалізацію методу в суперкласі шляхом опису методу з тією ж сигнатурою, тією назвою, тими ж параметрами і тим же типом повернення, що і в батьківському класі. Версія методу яку потрібно виконати, визначається об'єктом, який використовується для її виклику. Якщо виклик відбувається від об'єкту батьківського класу, то виконується версія батьківського класу, якщо ж об'єкт підкласу викликає метод, то виконується версія дочірнього класу. Деякі мови програмування дозволяють програмісту захищати метод від заміщення.

Заміщення чи перевизначення?[ред.ред. код]

У нас часто overriding перекладають як перевизначення, але в англійській мові для цього слова існує відповідник redefining, який інколи англомовні програмісти теж вживають як синонім overriding. Проте в термінології ООП прийнято вживати все ж термін overriding (заміщення), а термін перевизначення (redefining) практично не вживається, крім того між даними термінами є певна різниця. Про заміщення (overriding) говорять коли мають на увазі нестатичні методи класів, коли ж в новому класі описується нова версія статичного класу, то можна сказати, що статичний метод перевизначається (redefine), але не заміщується (override). Це пов'язано із правилами поліморфізму, які на статичні методи не поширюються, а отже повноцінна заміна (заміщення) не відбувається. В ООП перевизначення нового статичного методу у підкласі називають приховуванням (hiding) методу. [2][3]. Тобто перевизначення — це можна сказати більше розмовне поняття, яке має ширше значенням ніж заміщення. Можна також трактувати це таким чином, що коли говорять про процес написання коду програмістом то можна говорити, що він перевизначає старий метод, тобто визначає, пише нову версію методу, коли ж говорити про сам код програми, її виконання, класи, об'єкти та їхню роботу із виклику нестатичних методів підкласів та надкласів, то правильніше говорити, що відбувається заміщення методу.

Приклади[ред.ред. код]

Java[ред.ред. код]

Наступний приклад на мові програмува Java демонструє заміщення методу message().

 class Thought {
    public void message() {
        System.out.println("I feel like I am diagonally parked in a parallel universe.");
    }
}
 
public class Advice extends Thought {
    @Override  // Анотація @Override в Java 5 є необов'язковою проте корисною.
    public void message() {
        System.out.println("Warning: Dates in calendar are closer than they appear.");
    }
}

Клас Thought (Думка) є суперкласом і реалізує метод названий message(). Підклас з назвою Advice (Порада) успадковує методи, що є у класі Thought. Проте, клас Advice заміщує метод message(), змінивше те, що він робить.

Thought parking = new Thought();
parking.message();  // Виводить "I feel like I am diagonally parked in a parallel universe."
 
Thought dates = new Advice();  // Polymorphism
dates.message();  // Виводить "Warning: Dates in calendar are closer than they appear."

В Java, щоб викликати метод суперкласу, який заміщений у підкласі, можна скористатися ключовим словом super.

public class Advice extends Thought {
      @Override
      public void message() {
          System.out.println("Warning: Dates in calendar are closer than they appear.");
          super.message();  // Викликає батьківську версію методу.
      }
  }

Існують методи, які підклас не може заміщати. Для прикладу, в Java методи оголошені як фінальні(final) не можуть бути заміщені. Методи оголошені приватними або статичними також не можуть бути заміщені, оскільки вони по замовчуванню розуміються як фінальні. Також, якщо цілий клас оголошений як final, то він не може стати суперкласом.

Дивіться також[ред.ред. код]

Джерела[ред.ред. код]