Overloading & Overriding in OOP

Overloading and Overriding
Overloading and Overriding

دو مفهوم Overloading و Overriding مانند دیگر مفاهیم کلاس ، کپسوله سازی ، چند ریختی و ... در زبان های برنامه نویسی شی گرا هستند که در این پست می خواهیم با این دو ویژگی آشنا شویم.



مفهوم Overriding

در مفاهیم شی گرایی ، overriding به معنی تغییر کارکرد یک تابع موجود در برنامه است ، هنگامی که در حال پیاده سازی قابلیت ارث بری در شی گرایی هستیم تمامی متد های کلاس پدر با توجه به سطح دسترسی آن ها در کلاس فرزند هم قابل دسترسی هستند. اگر کلاس فرزند بخواهد پیاده سازی خاص خود را در یکی از متد های کلاس پدر داشته باشد از قابلیت Overriding استفاده می کند.

قابلیت Overriding زمانی رخ می دهد که دو متد که یکی در کلاس پدر و دیگری در کلاس فرزند قرار دارد، دارای نام یکسان باشند و تعداد پارامتر آن ها برابر باشد (signature method یکسان داشته باشند) و نوع بازگشتی (return type) یکسانی داشته باشند. این قابلیت به کلاس فرزند اجازه می دهد که پیاده سازی خاص خود را از متدی که در کلاس پدر قرار دارد برای خود داشته باشد.

متدی که در کلاس پدر قرار دارد را overridden method می گویند و متدی که در کلاس فرزند قرار دارد را overriding method می گویند. مثلا در زبان PHP بر اساس شی (object) مورد استفاده شده برای فراخوانی متد ، PHP تصمیم میگیرد که کدام متد overridden و یا overriding است.


<?php
class parent
 {
   public function greet() { 
     return 'Hello!'; 
   }
 }

 class child extends parent
 {
   public function greet() { 
     return 'Hi'; 
   }
 }



مفهوم Overloading

در مفاهیم شی گرایی Overloading به این معنی است که دو و یا چند متد می توانند نام یکسانی داشته باشند، اما پارامتر های آن ها با هم متفاوت باشند. مفهوم Overloading به این توانایی و قابلیت اشاره دارد که از یک شناسه واحد برای تعریف چندین متد از یک کلاس استفاده کنیم که در پارامتر های ورودی و نه لزوما در نوع بازگشتی (return type) متفاوت باشند.

در زبان برنامه نویسی PHP واژه Overloading به منظور ایجاد متدها و متغیرهای داینامیک استفاده می شود. این متدها و متغیرها به وسیله متدهای جادویی ( Magic Methods) مانند ( )call__ و ( )callStatic__ ساخته می شوند.

<?php

class greet {
  public function __call($name, $arguments) {
       echo &quotCalling object method '$name' &quot. implode(',  ',  $arguments);
  }

public static function __callStatic($name, $arguments) {
	echo &quotCalling static method '$name' &quot. implode(', ', $arguments). &quot\n&quot
  }
}

$object = new greet;

$object->hi('object context');
greet::hi('static context');