Skip to content

Commit 63cf97a

Browse files
author
Saeid Darvish
committed
l20: Method Overriding
1 parent 83bdc04 commit 63cf97a

1 file changed

Lines changed: 69 additions & 0 deletions

File tree

lessons/l20.rst

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,75 @@
133133
چندریختی (Polymorphism)
134134
---------------------------------------------------------------
135135

136+
چندریختی از کلمات یونانی Poly (زیاد) و Morphism (ریخت) گرفته شده است و در برنامه‌نویسی شی گرا به این معنی است که از یک نام یکسان متد برای انواع مختلف می‌توان استفاده کرد.
137+
138+
در مبحث برنامه‌نویسی شی گرا به شیوه‌های زیر می‌توان چندریختی (Polymorphism) را پیاده‌سازی کرد:
139+
140+
* Method Overriding
141+
* Method Overloading
142+
* Operator Overloading
143+
144+
در ادامه به بررسی و پیاده‌سازی هر مورد در زبان برنامه‌نویسی پایتون خواهیم پرداخت.
145+
146+
147+
Method Overriding
148+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
149+
150+
این نوع از چندریختی در هنگام پیاده‌سازی وراثت (Inheritance - درس هجدهم) قابل استفاده است و تا کنون نیز بارها از آن بهره گرفتیم!.
151+
152+
در واقع به پیاده‌سازی دوباره یک متد از کلاس **superclass** در کلاس **subclass** را **Method Overriding** می‌گویند. در این مواقع متد superclass در زیر سایه متد هم نام در subclass قرار می‌گیرد و هنگام فراخوانی متد توسط اشیای کلاس subclass، این متد subclass است که فراخوانی می‌گردد:
153+
154+
.. code-block:: python
155+
:linenos:
156+
157+
class Animal:
158+
159+
def breathe(self):
160+
print('Animal, breathing...')
161+
162+
def walk(self):
163+
print('Animal, wlking...')
164+
165+
166+
class Dog(Animal):
167+
168+
def walk(self):
169+
print('Dog, wlking...')
170+
171+
172+
dog = Dog()
173+
dog.breathe()
174+
dog.walk()
175+
176+
177+
::
178+
179+
Animal, breathing...
180+
Dog, wlking...
181+
182+
در این نمونه کد، کلاس Dog از کلاس Animal ارث‌بری دارد و متد ``walk`` از کلاس Animal را Override کرده است. همانطور که از خروجی مشاهده می‌شود، برخلاف متد ``breathe``، هنگام فراخوانی متد ``walk`` توسط شی Dog، متد باز‌پیاده‌سازی شده موجود در این کلاس فراخوانی می‌شود.
183+
184+
.. tip::
185+
186+
همان‌طور که پیش‌تر نیز انجام می‌دادیم، چنانچه تمایل به فراخوانی متد متناظر در superclass را داشته باشیم، می‌توانیم از تابع ``super`` استفاده کنیم.
187+
188+
.. tip::
189+
190+
اتفاقی که در بحث انتزاع (Abstraction) و ارث‌بری از کلاس‌های Abstract شاهد بودیم نیز در واقع پیروی از همین مبحث بوده و با این تفاوت که Method Overriding اجباری می‌بود.
191+
192+
.. tip::
193+
194+
در زبان برنامه‌نویسی پایتون تنها این نام متدهاست که در Method Overriding نقش دارد و تعداد پارامترهای تعریف شده در هر متد مهم نمی‌باشد. بنابراین متد همنام موجود در subclass می‌تواند پارامترهای متفاوتی نسبت superclass داشته باشد. البته تغییر در پارامترهای متد باز‌پیاده‌سازی شده چیزی نیست که بخواهیم آن را پیشنهاد بدهیم (به خصوص در بحث پیاده‌سازی متدهای Abstract) چرا که یکی از پیامدهای آن شکسته شدن اصل Liskov Substitution Principle [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Liskov_substitution_principle>`__] می‌شود.
195+
196+
197+
198+
Method Overloading
199+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
200+
201+
202+
203+
Operator Overloading
204+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
136205

137206

138207

0 commit comments

Comments
 (0)