در قسمت قبل تا حدودی با کلاس ها آشنا شده اید. در این قسمت وارد مبحث وراثت می شویم. باز هم برای درک بهتر این مفهوم مثالی را ذکر می کنم. برای ساده گی کدها ترجیح می دهم از کد های جاوا استفاده کنم. 
کلاس Point را با فیلدهای x ، y و همچنین یک سازنده و متدهای خواندن/نوشتن برای هر یک از فیلدها تعریف کنید. حال می خواهیم کلاس Circle را ایجاد کنیم. هر دایره دارای یک مرکز و یک شعاع می باشد. مرکز دایره یک نقطه است. می توانیم فیلدی به نام center از کلاس Point را در این کلاس تعریف کنیم. ولی از این کار صرف نظر می کنیم زیرا این کار ما را از هدفمان دور خواهد کرد. بنابراین سه فیلد به نام های x، y و r تعریف خواهیم کرد. 
 

public class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void setX(int x) {
        this.x = x;
    }
    public void setY(int y) {
        this.y = y;
    } 
}
public class Circle { private int x; private int y; private int r; public Circle(int x, int y, int r) { this.x = x; this.y = y; this.r = r; } public int getX() { return x; } public int getY() { return y; } public int getR() { return r; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public void setR(int r) { this.r = r; } } 

با مقایسه کلاس های Point و Circle به ساده گی می توان دید که بسیاری از کدهای کلاس Circle در کلاس Point وجود دارند. در واقع ما می توانیم با استفاده از وراثت از نوشتن کدهای تکراری خود داری کنیم. برای این منظور باید کلاسPoint را به کلاس Circle گسترش (extends) دهیم. به این عمل در مفاهیم شی گرایی عمل اشتقاق یا مشتق شدن گویند. در واقع کلاس Circle از کلاس Point مشتق شده است. در این صورت کلاس Point را فوق کلاس(super-class) و کلاس Circle را زیرکلاس (sub-class) گوییم. 
نکته: در زبان C++ از واژه های کلاس والد، پایه یا مبنا (base class) و کلاس مشتق شده (derived class) استفاده می شوند 
منظور از گسترش یک کلاس افزودن فیلدها و متدهای جدید به آن کلاس است که قابلیت های کلاس را افزایش می دهد. کلاس Circle با گسترش دادن کلاس Point علاوه بر در اختیار داشتن فیلدها و متدهای کلاس پایه خود، یک فیلد جدید به نام r و هم چنین متدهای خواندن/نوشتن را به ان اضافه کرده است. در واقع کلاس Circle دارای سه فیلد x، y و r می باشد. می توان سایر متدها ی مورد نیاز را به کلاس Circle اضافه نماییم. 
فیلدهای x و y در کلاس Point به صورت خصوصی تعریف شده اند پس در خارج از این کلاس و حتی در کلاس مشتق شده از آن در دسترس نمی باشند. برای آنکه به فیلدهای کلاس پایه در کلاس مشتق شده دسترسی داشته باشیم باید نوع دستیابی فیلد ها را به protected تغییر دهیم. با انجام این کار شما می توانید به تمامی فیلدها و متدهایی که به صورت محافظت شده (protected) در کلاس پایه تعریف شده اند دسترسی داشته باشید اما همچنان این فیلدها در خارج از کلاس پایه در دسترس نخواهند بود. 

public class Point {
    protected int x;
    protected int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void setX(int x) {
        this.x = x;
    }
    public void setY(int y) {
        this.y = y;
    } 
}
public class Circle extends Point {
    
    protected int r;

    public Circle(int x, int y, int r) {
        super(x, y);
        this.r = r;
    }
    public int getR() {
        return r;
    }
    public void setR(int r) {
        this.r = r;
    } 
}

فیلد های x و y در کلاس Circle به طور صریح تعریف نشده اند بلکه تعریف انها در کلاس والدشان صورت گرفته است. در داخل کلاس Circle می توانیم به این فیلدها دسترسی داشته باشم. برای مقدار دهی اولیه فیلد های x و y باید سازنده کلاس والد را فراخوانی کرد. این کار توسط کلمه کلیدی super انجام می شود. در کلاس Point سازنده دو آرگومانی برای مقدار دهی فیلدها تعریف شده است. در سازنده کلاس Circle قبل از هر دستوری باید سازنده کلاس والد را به صورت super(x, y) فراخوانی نماییم. دقت کنید که دستور super باید اولین دستور در سازنده کلاس باشد. نکته مهم در وراثت ان است که کلاس های پایه از کلاس های مشتق شده خود هیچ گونه اطلاعی ندارند. 
حال تعریف کلاس Point و Circle را مشاهده کنید. 
در ادامه می خواهیم کلاس Cylinder را تعریف کنیم. یک استوانه علاوه بر مرکز و شعاع دارای پارامتر سومی به نام ارتفاع می باشد. پس می توانیم کلاس Circle را گسترش دهیم و از آن کلاس Cylinder را ایجاد نماییم. 

public class Cylinder extends Circle {
    
    private int h;

    public Cylinder(int x, int y, int r, int h) {
        super(x, y, r);
        this.h = h;
    }
    public int getH() {
        return h;
    }
    public void setH(int h) {
        this.h = h;
    } 
}

برای درک بهتر ساختار سلسله مراتب کلاس ها می توانیم از نموداری مشابه زیر استفاده کنیم. در این نمودار که برای ساده گی فقط فیلدها را نشان داده ایم، کلاس Point والد Circle و کلاس Circle نیز والد Cylinder می باشد. کلاس Point فقط دو فیلد x و y دارد. با گسترش آن(افزودن فیلد r) به کلا س Circle می رسیم. کلاس Circle دارای سه فیلد x، y و r می باشد. با بسط آن (افزودن فیلد h) به کلاس Cylinder خواهیم رسید. می توان همین گونه این سلسله مراتب را ادامه داد. همانطور که ملاحظه می کنید جهت پیکان ها رو به بالا هستند نه پایین. هر کدام از این فلش ها به معنی "مشتق شده از .. " می باشد و نه به معنی "مشتق شده به ... " . 
 


می توانستیم کلاس های Circle و Cylinder را از کلاس Point مشتق کنیم. تفسیر این کار بسیار ساده است! این کار با شما!!! 

 

آیا این پاسخ به شما کمک کرد؟ 71 کاربر این را مفید یافتند (72 نظرات)