بخشی از پاورپوینت

اسلاید 1 :

واسط Interface
دوره برنامهنويسی جاوا

اسلاید 2 :

حقوق مؤلف
کلیه حقوق این اثر متعلق به انجمن جاواکاپ است
بازنشر یا تدریس آنچه توسط جاواکاپ و به صورت عمومی منتشر شده است، با ذکر مرجع (جاواکاپ) بلامانع است
اگر این اثر توسط جاواکاپ به صورت عمومی منتشر نشده است و به صورت اختصاصی در اختیار شما یا شرکت شما قرار گرفته، بازنشر آن مجاز نیست
تغییر محتوای این اثر بدون اطلاع و تأیید انجمن جاواکاپ مجاز نیست

اسلاید 3 :

سرفصل مطالب
واسط (Interface)
کاربرد واسط در طراحی نرمافزار
واسط در نمودار UML
وراثت چندگانه (Multiple Inheritance)
کلاس داخلی (Inner Class)
کلاس داخلی بینام (Anonymous Inner Class)

اسلاید 4 :

واسط (interface)

اسلاید 5 :

یادآوری: کلاسها و متدهای انتزاعی (abstract)
متد انتزاعی: متدی که برای همه اشیاء یک کلاس وجود دارد،
اما پیادهسازی این متد در آن کلاس ممکن نیست
و باید در هر زیرکلاس پیادهسازی شود
مثل متد getArea در کلاس Shape
کلاس انتزاعی: کلاسی که قرار نیست شیئی مستقیماً از این نوع باشد
هر شیء از این نوع، نمونهای از یکی از زیرکلاسهای این نوع خواهد بود
گاهی همه متدهای یک کلاس انتزاعی هستند
و هیچ ويژگی (Field) مشترکی در این اَبَرکلاس تعریف نمیشود
چنین کلاسی عملاً یک واسط (interface) از عملکرد و رفتارهای زیرکلاسها است

اسلاید 6 :

مثال
کلاس Instrument یک کلاس کاملاً انتزاعی (pure abstract) است
هیچ متد غیر انتزاعی ندارد
ويژگی خاصی تعریف نمیکند
بهتر است به جای کلاس (class) یک واسط (interface) باشد

اسلاید 7 :

واسط (interface)
مفهوم عام واسط را قبلاً دیده بودیم:
واسط شیء: مجموعه عملکرد و رفتارهای عمومی شیء که برخلاف پیادهسازی پنهان، قابل استفاده و فراخوانی است
معنای خاص واسط (کلیدواژه interface در جاوا)
واسط مانند یک کلاس کاملاً انتزاعی است (pure abstract class)
هر متدی که در واسط (interface) تعریف شود: به صورت ضمنی: عمومی (public) و انتزاعی (abstract) است
هر متغیری که در واسط تعریف شود: به صورت ضمنی: عمومی، استاتیک و ثابت (final) است
واسط نشان میدهد که شیء چه رفتارها و عملکردی دارد
ولی نحوه اجرای این رفتارها را توصیف نمیکند (پیادهسازی ندارد)
Public Interface
Hidden Implementation

اسلاید 8 :

مثال:
معنا و کاربرد این واسط تقریباً مشابه این کلاس انتزاعی است:


مثل کلاس انتزاعی: ایجاد نمونه (شیء) از واسط ممکن نیست
عملگر new قابل اجرا روی یک واسط نیست
البته تفاوتهایی هم در عمل وجود دارد (که خواهیم دید)
public interface Shape {
double getArea();
double getPerimeter();
}
public abstract class Shape {
public abstract double getArea();
public abstract double getPerimeter();
}

اسلاید 9 :

پیادهسازی واسط
برای ارثبری از یک کلاس، از کلیدواژه extends استفاده میشود
برای ارثبری یک کلاس از یک واسط، از کلیدواژه implements استفاده میشود
class Rectangle implements Shape{.}
بین یک کلاس و واسطی که پیادهسازی کرده، رابطه is-a برقرار است
Rectangle is a Shape
اگر کلاسی یک واسط را پیادهسازی کند: باید همه متدهای آن را هم تعریف کند
وگرنه این کلاس، متدهای انتزاعی را به ارث برده و خودش هم باید انتزاعی شود
مثال: این کلاس باید به صورت انتزاعی تعریف شود زیرا متد انتزاعی getPerimiter را پیادهسازی نکرده است
abstract class Rectangle implements Shape{
public double getArea() { return .}
}

اسلاید 10 :

مثال
public interface Shape {
double getArea();
double getPerimeter();
}

اسلاید 11 :

ارثبری واسط از واسط
یک واسط میتواند از واسط (یا واسطهای) دیگری ارثبری کند
همه متدهای (انتزاعی) اَبَرواسط به زیرواسط به ارث میرسند
این کار هم با کلیدواژه extends انجام میشود
رابطه is a برقرار خواهد بود
یک واسط نمیتواند از یک کلاس ارثبری کند (غیرمجاز: خطای کامپایل)
interface CanRun{
void run();
}
interface CanThink{
void think();
}
interface CanTalk extends CanThink{
void talk();
}
interface Human extends CanRun, CanTalk{
void think();
}

اسلاید 12 :

خلاصه: وراثت و واسط
یک کلاس، فقط و فقط از یک کلاس میتواند ارثبری کند (extends)
هر کلاس، اَبَرکلاس مشخص دارد که با کلیدواژه extends مشخص میشود
وگرنه (اگر اَبَرکلاس تصریح نشود) زیرکلاس Object خواهد بود

یک کلاس صفر یا چند واسط را پیادهسازی میکند (implements)

یک واسط از صفر یا چند واسط ارثبری میکند (extends)

اسلاید 13 :

مثال

اسلاید 14 :

کوییز

اسلاید 15 :

سؤال
کلاس Hero باید چه متدهایی را پیادهسازی کند تا انتزاعی نباشد؟
پاسخ:
move, fly, swim

اسلاید 16 :

نکات تکمیلی درباره واسطها

اسلاید 17 :

تضاد اسامی
interface A{
int f();
}
interface B{
int f();
}
abstract class C implements A,B{ }
interface A{
void f();
}
interface B{
int f();
}
abstract class C implements A,B{ }
The return types are incompatible for the inherited methods A.f(), B.f()

اسلاید 18 :

چرا در جاوا ارثبری چندگانه برای کلاسها پشتیبانی نمیشود؟
چرا یک کلاس نمیتواند فرزند (زیرکلاس) چند کلاس باشد؟
طراحی پیچیده میشود (فهم آن هم سخت میشود)
وجود ويژگیهای همنام در اَبَرکلاسها مشکلساز میشود
Multiple Inheritance of State
وجود متدهایی که در چند اَبَرکلاس پیادهسازی شدهاند، مشکلساز میشود
Multiple Inheritance of Behavior

چرا ارثبری چندگانه برای واسطها پشتیبانی میشود؟
مشکلات کلاس در واسط وجود ندارد
در واسط متدها پیادهسازی نمیشوند و ويژگی (Property) وجود ندارد
وراثت چندگانه از واسطها، کاربردهای بسيار مهمی دارد
Multiple Inheritance of Type
نکته: این شکل از وراثت، به نوعی در جاوا 8 ممکن شده است

اسلاید 19 :

واسط: متغیرها و سازندهها
تعریف متغیر در یک واسط رایج نیست
در صورت تعریف متغیر:
متغیرها به طور ضمنی ثابت، استاتیک و عمومی (public) خواهند بود
مثال:

خلاصه: واسط، وضعیت و حالت (state) اشیاءش را توصیف نمیکند
امکان تعریف سازنده (constructor) در واسط وجود ندارد (چرا؟)
هدف سازنده، مقداردهی اولیه ويژگیهای شیء است (Field یا Property)
سازنده: حالت (وضعیت) اولیه شیء را آماده میکند
اما ويژگی خاصی در واسط تعریف نمیشود (واسط، حالت شیء را توصیف نمیکند)
interface Humans{
int MAX_AGE=150;
}
≈ public static final int MAX_AGE=150;

در متن اصلی پاورپوینت به هم ریختگی وجود ندارد. برای مطالعه بیشتر پاورپوینت آن را خریداری کنید