الوراثة في لغة دارت هي ميزة تسمح لك بإنشاء صلة تواصل بين كلاسين، حيث يمكن للكلاس الابن أن يرث الخصائص والأساليب من الكلاس الأساسية الأب. تُستخدم كلمة “extends” لتوريث الكلاس من الكلاس الأب. في هذا المقال سنتناول مفهوم الوراثة في لغة دارت وكيفية تعريف كلاس يستخدم الخصائص والأساليب الموجودة في كلاس أخر.
الصيغة العامة للوراثة في دارت
في لغة دارت، يتم تعريف الكلاس عن طريق استخدام الكلمة المفتاحية “class”. ولتوريث كلاس من كلاس أخر يتم استخدام الكلمة المفتاحية “extends”.
class ParentClass { // كود الكلاس الأب } class ChildClass extends ParentClass { // كود الكلاس الابن }
في هذه الصيغة، تكون ParentClass هو الكلاس الأب و ChildClass هو الكلاس الابن. الكلاس الابن يرث الخصائص والأساليب من الكلاس الأب.
معلومات هامة في الوراثة:
- الكلاس الأب: هو الكلاس الذي يرث منه الكلاس الأبن خصائص وأساليب. ويعرف أيضًا بالكلاس الرئيسي.
- الكلاس الأبن: هو الكلاس الذي يرث خصائص وأساليب من كلاس أخر. ويعرف أيضًا الكلاس الفرعي.
- لغة دارت تدعم الوراثة الفردية (Single Inheritance)، مما يعني أنه يمكن للكلاس أن يرث من كلاس واحد فقط. ولا تدعم الوراثة المتعددة (Multiple Inheritance)، وهذا يعني أن الكلاس لا يمكنه أن يرث من عدة كلاسات في نفس الوقت.
فوائد الوراثة في لغة دارت:
- تعزز إعادة استخدام الكود وتقلل من تكراره.
- تساعد في تصميم البرنامج بشكل أفضل.
- تجعل الكود أكثر بساطة ونظافة وتوفر الوقت والمال في عمليات الصيانة.
- تسهل إنشاء مكتبات الكلاسات.
- يمكن استخدامها لفرض واجهة قياسية لجميع الكلاسات الفرعية.
أمثلة على الوراثة في لغة دارت:
مثال 1: الوراثة في لغة دارت
في هذا المثال، سنقوم بإنشاء كلاس Person ثم إنشاء كلاس Student التي يرث الخصائص والأساليب من كلاس Person.
class Person { // الخصائص String? name; int? age; // الأسلوب أو الدالة void display() { print("Name: $name"); print("Age: $age"); } } class Student extends Person { // الخصائص String? schoolName; String? schoolAddress; // الأسلوب أو الدالة void displaySchoolInfo() { print("School Name: $schoolName"); print("School Address: $schoolAddress"); } } void main() { // إنشاء كائن من كلاس Student var student = Student(); student.name = "John"; student.age = 20; student.schoolName = "ABC School"; student.schoolAddress = "New York"; student.display(); student.displaySchoolInfo(); }
نتيجة الكود:
Name: John Age: 20 School Name: ABC School School Address: New York
في هذا المثال، قمنا بتعريف كلاس Person التي تحتوي على خصائص “name” و “age” ودالة “display”. ثم قمنا بتعريف كلاس Student الذي يرث من كلاس Person ويحتوي على خصائص “schoolName” و “schoolAddress” ودالة “displaySchoolInfo”. في الدالة main، قمنا بإنشاء كائن من كلاس Student وقمنا بتعيين القيم للخصائص ثم قمنا بعرض معلومات الطالب ومعلومات المدرسة.
مثال 2: الوراثة في لغة دارت
في هذا المثال، لدينا الكلاس الأساسي Car والكلاس الفرعي Toyota. يرث كلاس Toyota الخصائص والأساليب من كلاس Car.
class Car { String? color; int? year; void start() { print("Car started"); } } class Toyota extends Car { String? model; int? prize; void showDetails() { print("Model: $model"); print("Prize: $prize"); } } void main() { var toyota = Toyota(); toyota.color = "Red"; toyota.year = 2020; toyota.model = "Camry"; toyota.prize = 20000; toyota.start(); toyota.showDetails(); }
نتيجة الكود:
Car started Model: Camry Prize: 20000
في هذا المثال، قمنا بتعريف كلاس Car الذي يحتوي على خصائص “color” و “year” ودالة “start”. ثم قمنا بتعريف كلاس Toyota الذي يرث من كلاس Car ويحتوي على خصائص “model” و “prize” ودالة “showDetails”. في الدالة main، قمنا بإنشاء كائن من كلاس Toyota وتعيين القيم للخصائص ثم قمنا ببدء التشغيل للسيارة وعرض تفاصيل السيارة.
أنواع الوراثة في لغة دارت:
الوراثة الفردية (Single Inheritance):
في هذا النوع من الوراثة، يمكن للكلاس أن يرث من كلاس واحد فقط. في لغة دارت.
مثال:
class Animal { void eat() { print("Eating..."); } } class Cat extends Animal { void meow() { print("Meow!"); } } void main() { var cat = Cat(); cat.eat(); // الدالة موروثة من الكلاس الأساسي cat.meow(); // الدالة موجودة في الكلاس الابن }
في المثال أعلاه، لدينا كلاس أساسي يسمى “Animal” يحتوي على دالة “eat”، ونورث هذا الكلاس الي كلاس جديد يسمى “Cat”، والذي يضيف دالة إضافية تسمى “meow”. بفضل الوراثة الفردية، يمكن لكائن من النوع “Cat” استدعاء كلا الدالتين “eat” و “meow”.
الوراثة متعددة المستويات (Multilevel Inheritance):
في هذا النوع من الوراثة، يمكن للكلاس أن يرث من كلاس أخر وهذا الكلاس بدوره يرث من كلاس أخر.
مثال:
class GrandParentClass { // خصائص وأساليب كلاس الجد الأعلى } class ParentClass extends GrandParentClass { // خصائص وأساليب كلاس الأب } class ChildClass extends ParentClass { // خصائص وأساليب الكلاس الفرعي }
الوراثة الهرمية (Hierarchical Inheritance):
في هذا النوع من الوراثة، يمكن للكلاس أن يرث من كلاس واحد، ولكن يمكن أن يتم تمديد الكلاس الواحد من قبل عدة كلاسات فرعية. بمعنى آخر، هناك كلاس واحد يعمل ككلاس أساسي لعدة كلاسات فرعية.
مثال:
class Animal { void eat() { print("Eating..."); } } class Cat extends Animal { void meow() { print("Meow!"); } } class Dog extends Animal { void bark() { print("Bark!"); } } void main() { var cat = Cat(); cat.eat(); cat.meow(); var dog = Dog(); dog.eat(); dog.bark(); }
في هذا المثال، لدينا كلاس “Animal” يحتوي على دالة “eat”، ونورث هذا الكلاس الى 2 كلاس فرعيين هما “Cat” و “Dog”. كلا الكلاسين الفرعيين يرثان الدالة “eat” من الكلاس الأساسي “Animal”، ويحتوي كل منهما على دالة خاصة به.
الوراثة المتعددة (Multiple Inheritance):
في هذا النوع من الوراثة، يمكن للكلاس أن يرث من عدة كلاسات في نفس الوقت. ومع ذلك، يجب أن نلاحظ أن لغة دارت لا تدعم الوراثة المتعددة.
تعتبر الوراثة من المفاهيم الأساسية في برمجة الكائنات، وتسمح لنا بإنشاء هيكلية قوية ومنظمة للبرامج. في لغة دارت، توفر آلية الوراثة عدة أنواع تساعدنا في تنظيم وتوسيع الأكواد وإعادة استخدامها بكفاءة. في هذا المقال، تعرفنا أنواع الوراثة المدعومة في لغة دارت وكيفية استخدامها.