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

Заміщення чи перевизначення?

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

Приклади

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, то він не може стати суперкласом.

Python У мові Python, коли підклас містить метод, який заміщує метод суперкласу, можна викликати метод з суперкласу за допомогою для Python 3 — дивись https://docs.python.org/3/library/functions.html#super замість . Приклад:

class Thought(object): def __init__(self): print("I'm a new object of type Thought!") def message(self): print("I feel like I am diagonally parked in a parallel universe.")

class Advice(Thought): def __init__(self): super(Advice, self).__init__() def message(self): print("Warning: Dates in calendar are closer than they appear") super(Advice, self).message()

t = Thought() # "I'm a new object of type Thought!" t.message() # "I feel like I am diagonally parked in a parallel universe.

a = Advice() # "I'm a new object of type Thought!" a.message() # "Warning: Dates in calendar are closer than they appear" # "I feel like I am diagonally parked in a parallel universe.

# Перевірка належності класу:

isinstance(t, Thought) # True

isinstance(a, Advice) # True

isinstance(a, Thought) # True

Див. також Метод (програмування) Перевантаження функції

Примітки