You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
چندریختی از کلمات یونانی 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
+
classAnimal:
158
+
159
+
defbreathe(self):
160
+
print('Animal, breathing...')
161
+
162
+
defwalk(self):
163
+
print('Animal, wlking...')
164
+
165
+
166
+
classDog(Animal):
167
+
168
+
defwalk(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>`__] میشود.
0 commit comments