استكشاف الميراث والفئات المجردة
فئتا التوريث والخلاصة هما نوعان من بنيات البرمجة المهمة التي توجد في لغات البرمجة الموجهة للكائنات. تُستخدم هذه المفاهيم لإنشاء علاقات الأصل والتابع بين الفئات. يسمح التوريث للفئة الفرعية بتوسيع فئة أعلى. ترث الفئة الفرعية جميع سمات الفئة الأعلى وأساليبها. يمكن للفئات الفرعية أيضاً تجاوز سلوك أو إضافة المزيد من الوظائف إلى الأساليب الموروثة من الفئة الأعلى.
التوريث
لفهم مفهوم التوريث بشكل أفضل في البرمجة الموجهة للكائنات، دعنا نراجع مثالاً من العالم الحقيقي. في هذا المثال، المركبة هي الفئة الأصل. هناك العديد من أنواع المركبات المختلفة، على سبيل المثال: السيارات والحافلات والشاحنات. في هذا السيناريو، المركبة هي الفئة الأصل. السيارات والحافلات والشاحنات هي فئات ترث من المركبة. تحتوي فئة المركبة على الخصائص التي تتم مشاركتها عبر جميع أنواع المركبات (السرعة واللون والتروس مثلاً). قد تختلف خصائص كل نوع من أنواع المركبات. على سبيل المثال، قد تحتوي الشاحنة على نظام دفع رباعي، لكن السيارة ليست كذلك.

مثال
يوضح المثال التالي كيف يستخدم الفصل الميراث. تقوم فئة "السيارة" بتوسيع فئة "المركبة" للحصول على الطول والعرض ولكنها تضيف أيضاً متغير عدد الركاب.
class Vehicle
{
// Instance fields.
real height;
real width;
// Constructor to initialize fields height and width.
new(real _height, real _width)
{
height = _height;
width = _width;
}
}
class Car extends Vehicle
{
// Additional instance field numberOfPassengers. Fields height and width are inherited.
int numberOfPassengers;
// Constructor is overridden to initialize numberOfPassengers.
new(real _height, real _width, int _numberOfPassengers)
{
// Initialize the fields.
super(_height, _width);
numberOfPassengers = _numberOfPassengers;
}
}
الخلاصة
يتم تحيد فئات الخلاصة بواسطة الكلمة الأساسية الخلاصة. لا يمكن إنشاء مثيل لها ولكنها تتطلب فئة فرعية موروثة من فئة الخلاصة. تُستخدم فئات الخلاصة لتنفيذ مفهوم ستكمله الفئة الفرعية بعد ذلك. يمكن أيضاً الإعلان عن أساليب الخلاصة في فئات الخلاصة. لا تسمح أساليب الخلاصة بالرمز أو الإعلانات في الأسلوب. يجب أن تقوم الفئة الفرعية بتوسيع فئة الخلاصة لاستخدام أسلوب الخلاصة.
مثال
فيما يلي مثال لفئة خلاصة. تقوم فئة "السيارة" بتوسيع فئة الخلاصة "المركبة" يسمح هذا لفئة "السيارة" بتجاوز أسلوب printInfo() ويسمح لك بإضافة وظيفة إلى أسلوب operate() الذي لم يتم تضمينه في فئة الخلاصة.
abstract class Vehicle
{
str owner;
int age;
void printInfo()
{
Info(strfmt("%1, %2",owner, age));
}
abstract void operate()
{
}
}
class Car extends Vehicle
{
str model;
void printInfo()
{
// overriding default functionality
Info(strfmt("%1, %2, %3",owner, age, model));
}
void operate()
{
Info('running');
}
}