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

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

Python

У мові Python, коли підклас містить метод, який заміщує метод суперкласу, можна викликати метод з суперкласу за допомогою super(Subclass, self).method[4] замість self.method. Приклад:

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

Див. також

Примітки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.