ارثبری (Inheritance) :
در برنامهنویسی شیءگرا یا OOP مفهومی به نام ارثبری Inheritanceداریم. مفهوم ارثبری به برنامهنویسان این امکان را میدهد که کلاس جدیدی (مثلا کلاس دختر یا Girl) را بر اساس کلاس موجود (مثلا کلاس مادر یا Mom) تعریف کنند و ویژگیها و رفتارهای کلاس مادر را به کلاس فرزند منتقل کنند. در واقع، کلاس فرزند میتواند از کلاس والد به عنوان یک پایه برای ساختار خود استفاده کند.
مفهوم ارثبری دارای انواع مختلفی است:
در ارثبری تکی، تمرکز روی این است که فقط کلاس فرزند از یک کلاس والد ارثبری کند. به عنوان مثال، در کد زیر، کلاس "دختر" (Girl) از کلاس "انسان" (Human) ارثبری کرده است.
مثالی که Single Inheritance را رعایت می کند:
class Human { String name; int age; Human(this.name, this.age); void displayHumanInfo() { print('نام: $name'); print('سن: $age سال'); } } class Girl extends Human { Girl(String name, int age) : super(name, age); void displayGirlInfo() { print('من یک دختر هستم'); } } void main() { Girl sara = Girl('سارا', 25); sara.displayHumanInfo(); sara.displayGirlInfo(); }
وقتی میخواهیم از کلاس Girl یک نمونه بسازیم ما باید age و name را برای کلاس Girlمقدار دهی کنیم در واقع داریم برای کلاس "Human" مقداردهی را انجام میدهیم و چون کلاس"Girl" از کلاس "Human" به عنوان کلاس پایه ارثبری کرده است, مقادیر به کلاس Girl نیز به ارث خواهد رسید .
مثالی که Single Inheritance را نقض می کند:
اگر بخواهیم مثالی داشته باشیم که این مورد را نقض کند میتوانیم به ارث بری چندگانه مراجعه کنیم .
وقتی که یک کلاس فرزند از دو کلاس پدر به عنوان کلاس پایه به ارث ببرد. به عبارت دیگر، ارثبری از چند کلاس پدر به یک کلاس فرزند تضاد ایجاد میکند و این درست نیست.
یا اینکه به مثال زیر نگاهی بیندازیم که اصل وراثت را به طرز صحیحی پیاده نکرده است:
class Vehicle { void startEngine() { print('موتور راهاندازی شد.'); } void stopEngine() { print('موتور متوقف شد.'); } void accelerate() { print('سرعت افزایش یافت.'); } void brake() { print('ترمز زده شد.'); } } class Bicycle extends Vehicle { // Mistake!!! : تمام ویژگیها و رفتارهای "وسیله نقلیه" توسط "دوچرخه" ارثبری شده است }
ایراد این مثال در این است که رفتارها و ویژگی های یک دوچرخه با یک ماشین متفاوت است ولی ارث بری کلاس Bicycle از Vehicle منجر به رفتارها و ویژگی هایی برای دچرخه شده که برخی از آنها را ندارد.
اگر بخواهیم این مثال را اصلاح کنیم میتوانیم به شکل زیر آن را تغییر دهیم:
کد اصلاح شده ی مثالی که Single Inheritance را نقض میکرد:
class Vehicle { void color(String selectedColor) { print('رنگ وسیله نقلیه: $selectedColor'); } void name(String selectedName) { print('نام وسیله نقلیه: $selectedName'); } void maxSpeedPerHour(int mph) { print('سرعت وسیله نقلیه: $mph'); } } class Bicycle extends Vehicle { void pedal() { print('پدال زدن دوچرخه را حرکت داد'); } } void main() { Bicycle bicycle = Bicycle(); bicycle.name("Top Bicycle Brand"); bicycle.color("red"); bicycle.maxSpeedPerHour(25); bicycle.pedal(); }
در نسخه اصلاح شده، میتوانید انتزاع بیشتری در کلاس Vehicle مشاهده کنید که ویژگیها و رفتارهای نامناسب کلاس قبلی Bicycle را از بین برده است.
در مجموعه مقالات برنامهنویسی شیءگرا، مانند مقالات SOLID، برای هر یک از اصول برنامهنویسی شیءگرا (OOP)، مثالهایی با استفاده از زبان برنامهنویسی Dart خواهیم داشت که نمونههای صحیح و نمونههای نادرست پیادهسازی این اصول را نشان میدهیم.
مقالات مرتبط:
پیاده سازی OOP با کدهای دارت برای فریم ورک Flutter
پیاده سازی ارث بری در OOP با کدهای دارت برای فریم ورک Flutter-بخش اول