Заміщення методу (англ. Method overriding, інколи помилково перекладають як перевизначення методу) в об'єктно-орієнтованому програмуванні — можливість мови програмування, що дозволяє підкласу або дочірньому класу надавати специфічну реалізацію методу, що вже реалізований в одному із суперкласів. Реалізація методу в підкласі заміщає реалізацію методу в суперкласі шляхом опису методу з тією ж сигнатурою, тією назвою, тими ж параметрами і тим же типом повернення, що і в батьківському класі. Версія методу яку потрібно виконати, визначається об'єктом, який використовується для її виклику. Якщо виклик відбувається від об'єкту батьківського класу, то виконується версія батьківського класу, якщо ж об'єкт підкласу викликає метод, то виконується версія дочірнього класу. Деякі мови програмування дозволяють програмісту захищати метод від заміщення.
Заміщення чи перевизначення?
У нас часто 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, коли підклас містить метод, який заміщує метод суперкласу, можна викликати метод з суперкласу за допомогою super(Subclass, self).method
замість 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
Див. також
Примітки
- . Архів оригіналу за 14 травня 2021. Процитовано 26 грудня 2012.
- . Архів оригіналу за 26 грудня 2013. Процитовано 26 грудня 2012.
- . Архів оригіналу за 8 березня 2013. Процитовано 26 грудня 2012.
-
super().method
для Python 3 - дивись https://docs.python.org/3/library/functions.html#super [ 26 жовтня 2018 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zamishennya metodu angl Method overriding inkoli pomilkovo perekladayut yak pereviznachennya metodu v ob yektno oriyentovanomu programuvanni mozhlivist movi programuvannya sho dozvolyaye pidklasu abo dochirnomu klasu nadavati specifichnu realizaciyu metodu sho vzhe realizovanij v odnomu iz superklasiv Realizaciya metodu v pidklasi zamishaye realizaciyu metodu v superklasi shlyahom opisu metodu z tiyeyu zh signaturoyu tiyeyu nazvoyu timi zh parametrami i tim zhe tipom povernennya sho i v batkivskomu klasi Versiya metodu yaku potribno vikonati viznachayetsya ob yektom yakij vikoristovuyetsya dlya yiyi vikliku Yaksho viklik vidbuvayetsya vid ob yektu batkivskogo klasu to vikonuyetsya versiya batkivskogo klasu yaksho zh ob yekt pidklasu viklikaye metod to vikonuyetsya versiya dochirnogo klasu Deyaki movi programuvannya dozvolyayut programistu zahishati metod vid zamishennya Ilyustraciya zamishennyaZamishennya chi pereviznachennya U nas chasto overriding perekladayut yak pereviznachennya ale v anglijskij movi dlya cogo slova isnuye vidpovidnik redefining yakij inkoli anglomovni programisti tezh vzhivayut yak sinonim overriding Prote v terminologiyi OOP prijnyato vzhivati vse zh termin overriding zamishennya a termin pereviznachennya redefining praktichno ne vzhivayetsya krim togo mizh danimi terminami ye pevna riznicya Pro zamishennya overriding govoryat koli mayut na uvazi nestatichni metodi klasiv koli zh v novomu klasi opisuyetsya nova versiya statichnogo klasu to mozhna skazati sho statichnij metod pereviznachayetsya redefine ale ne zamishuyetsya override Ce pov yazano iz pravilami polimorfizmu yaki na statichni metodi ne poshiryuyutsya a otzhe povnocinna zamina zamishennya ne vidbuvayetsya V OOP pereviznachennya novogo statichnogo metodu u pidklasi nazivayut prihovuvannyam hiding metodu Tobto pereviznachennya ce mozhna skazati bilshe rozmovne ponyattya yake maye shirshe znachennyam nizh zamishennya Mozhna takozh traktuvati ce takim chinom sho koli govoryat pro proces napisannya kodu programistom to mozhna govoriti sho vin pereviznachaye starij metod tobto viznachaye pishe novu versiyu metodu koli zh govoriti pro sam kod programi yiyi vikonannya klasi ob yekti ta yihnyu robotu iz vikliku nestatichnih metodiv pidklasiv ta nadklasiv to pravilnishe govoriti sho vidbuvayetsya zamishennya metodu PrikladiJava Nastupnij priklad na movi programuvannya Java demonstruye zamishennya metodu 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 Anotaciya Override v Java 5 ye neobov yazkovoyu prote korisnoyu public void message System out println Warning Dates in calendar are closer than they appear Klas Thought Dumka ye superklasom i realizuye metod nazvanij message Pidklas z nazvoyu Advice Porada uspadkovuye metodi sho ye u klasi Thought Prote klas Advice zamishuye metod message zminivshi te sho vin robit Thought parking new Thought parking message Vivodit I feel like I am diagonally parked in a parallel universe Thought dates new Advice Polymorphism dates message Vivodit Warning Dates in calendar are closer than they appear V Java shob viklikati metod superklasu yakij zamishenij u pidklasi mozhna skoristatisya klyuchovim slovom super public class Advice extends Thought Override public void message System out println Warning Dates in calendar are closer than they appear super message Viklikaye batkivsku versiyu metodu Isnuyut metodi yaki pidklas ne mozhe zamishati Dlya prikladu v Java metodi ogolosheni yak finalni final ne mozhut buti zamisheni Metodi ogolosheni privatnimi abo statichnimi takozh ne mozhut buti zamisheni oskilki voni po zamovchuvannyu rozumiyutsya yak finalni Takozh yaksho cilij klas ogoloshenij yak final to vin ne mozhe stati superklasom Python U movi Python koli pidklas mistit metod yakij zamishuye metod superklasu mozhna viklikati metod z superklasu za dopomogoyu super Subclass self method zamist self method Priklad 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 Perevirka nalezhnosti klasu isinstance t Thought True isinstance a Advice True isinstance a Thought TrueDiv takozhMetod programuvannya Perevantazhennya funkciyiPrimitki Arhiv originalu za 14 travnya 2021 Procitovano 26 grudnya 2012 Arhiv originalu za 26 grudnya 2013 Procitovano 26 grudnya 2012 Arhiv originalu za 8 bereznya 2013 Procitovano 26 grudnya 2012 super method dlya Python 3 divis https docs python org 3 library functions html super 26 zhovtnya 2018 u Wayback Machine