تالار گفتمان nCIS.ir

نسخه‌ی کامل: رابط یا Interface چیست؟
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
یکی از دوستان توی گروه تلگرام چنین سؤالی مطرح کردن:

نقل قول:Implement دقیقا یعنی چی ؟ وقتی یه کلاس Implement میشه مثلا از broadcast یا هرچیز دیگه چه اتفاقی میوفته ؟
ببینید توی بحث شئ‌گرایی مفهومی وجود داره بنام رابط یا interface

رابطها برای ایجاد یک استاندارد بین اشیاء کلاسها بوجود اومدن. مثلاً شما میخواین تمام کلاسها رفتاری (متدی) به اسم onClick داشته باشن. خوب یک راه اینه که توی کلاس والد، متد مربوطه رو بصورت abstract اضافه کنید. اینطوری فرزندها موظف هستن اون رو پیاده‌سازی کنن. ازطرفی یه محدودیت وجود داره و اونم اینه که یک کلاس نمیتونه دوتا پدر داشته باشه. بخاطر همین رابطها رو معرفی کردن. یعنی یک کلاس با وجود اینکه حداکثر یک کلاس والد داره ولی میتونه چندین رابط رو پیاده‌سازی کنه. درست مثل بچه‌ای که میتونه پسر یا دختر باشه و درعین‌حال، چندین خصوصیت مثل درسخوان بودن، مرتب بودن، زرنگ بودن، تمیزبودن و... رو داشته باشه. حالا ممکنه تعریف یکی از درسخوان بودن با یکی دیگه فرق کنه. مثلاً یکی بگه من معدل بالای 12 برام کافیه و یکی دیگه بگه نه باید حتماً 20 بگیره. یکی بگه درسخوان یعنی وسط جمع هم درسش رو بخونه و یکی دیگه بگه نه باید بره تو اتاقش درسشو بخونه. پس نحوه پیاده‌سازی توی خود رفتار درسخوان بودن تعریف نشده و فقط داشتن چنین رفتاری موردنظره. تا اینجا رو متوجه شدین؟ حالا بریم سر معادلسازی توی دنیای برنامه‌نویسی

وقتی میگیم یه کلاس از یه کلاس دیگه Extend شده، یعنی ارث برده و فرزندش هست. پس دیگه نمیتونه از کلاس دیگری مشتق بشه چون فرزند یه کلاس دیگه نمیتونه باشه. اما وقتی میگیم فلان رابط رو Implement میکنه، یعنی داره اون رو پیاده‌سازی میکنه. پس باید تمام متدهایی که اونجا اعلام شده رو داشته باشه. هرچند نحوه پیاده‌سازیش مهم نیست و فقط نوع و تعداد پارامترهای ورودی، نام متدها و نوع خروجی متد توسط رابط دیکته میشه. درنهایت موقع استفاده از اشیاء میتونیم با بررسی اینکه از نوع رابط خاصی هستن، با خیال راحت متدها رو صدا بزنیم چون مطمئنیم که اون متدها رو دارن (هرچند روش پیاده‌سازیشون ممکنه با هم فرق کنه). حالا یه مثال هم میزنم که بهتر متوجه بشین.

مثال:
public interface Shape {
    public int area();
    public int pyramid();
}

توی این رابط فقط مشخص شده که متدهای area و pyramid باید وجود داشته باشن اما نگفته چطور باید پیاده‌سازی بشن. خوب این منطقی هم هست چون هر شکلی فرمول محیط و مساحتش با شکلهای دیگه فرق میکنه. حالا یکی دو تا کلاس رو ببینید که این رابط رو پیاده‌سازی میکنن:
public class Rectangle implements Shape {
    public int x;
    public int y;

    public int area() {
        return a * b;
    }

    public int pyramid() {
        return 2 * (a + b);
    }
}

public class Square implements Shape {
    public int side;

    public int area() {
        return side * side;
    }

    public int pyramid() {
        return 4 * side;
    }
}

و حالا این کلاس که رابط رو پیاده‌سازی نکرده:
public class Point {
    public int x;
    public int y;
}

و یه مثال از نحوه استفاده و کنترل اونها:
Point p = new Point();
p.x = 5;
p.y = 10;
Square s = new Square();
s.side = 5;
Rectangle r = new Rectangle();
r.a = 3;
r.b = 2;
ArrayList<Object> objs = new ArrayList<>();
objs.add(p);
objs.add(s);
objs.add®;
for(Object obj : objs) {
    if(obj instanceof Shape) {
        Log.i("LOG", "Area: " + obj.area() + " , Pyramid: " + obj.pyramid());
    }
}

توی مثال فوق، دستور داخل if برای p اجرا نمیشه