صفحه 1:
ارث بری ۲
استفاده ی مجدد از کلاس توسط ورائت
مظفر بگ محصدی
دانشكاه ايلام
صفحه 2:
آیا اجزاء سازنده به ارث برده می شوند؟
نمی توان از سازنده ی 66 ۲۲۲۱0۱0۷ برای ایجاد اشیاء
۵ استفاده کرد.
ما باید برای 665 ۳۱0۱۱۲۱۷۶۲۱۵۱۵ یک سازنده ی مناسب ایجاد کنیم. اما
سازنده ی 66 ۲۱۵۷۱۲۱۷۶۲۵۱0۱ چگونه می تواند متغییرهای خصوصی
کلاس ۴۲۲۱0۱۵۷66 را مقداردهی اولیه نماید در حالی که دسترسی
مستقیم بعه آنها ندارد؟
صفحه 3:
سازنده ی 5۱06۲
کلاس مشتق شده می تواند به شکل زیر از سازنده ی کلاس پایه برای
مقداردهی متغییرهای خصوصی به ارث برده شده از کلاس پایه استفاده کند.
public DerivedClass(int pl, int p2, double p3) ®
1
super(p1, p2);
derivedClassInstanceVariable = p3;
1
#در مثال فوق. دستور ( 02 ,1) ۶50106۲ سازنده ی کلاس پایه را
فراخوانی می کند.
صفحه 4:
سازنده ی 5۱06۲
#برای فراخوانی سازنده ی کلاس پایه نمی توانید از اسم کلاس پایه استفاده
کنید و باید از کلمه ی کلیدی 06۲ [5۱ استفاده کنید.
#فراخوانی 5۱06۲ باید اولین کاری باشد که در سازنده انجام می شود.
© نمی توان متغییرهای کلاس را به عنوان پارامتر به 51106۲ ارسال کرد.
صفحه 5:
سازنده ی 5۱06۲
*اگر یک کلاس مشتق شده متد 5۱106۲ را فراخوانی نگند.
سازنده ی بدون آرگومان کلاس پایه بصورت خودگار
فراخوانی می گردد.
#اگر کلاس پایه سازنده ی بدون آرگومان نداشته باشد.
منجر به تولید خطا می شود.
*چون متغییرهای به ارث برده شده باید مقدار دهی اولیه شوند.
و سازنده ی کلاس پایه برای این کار طراحی شده است. لذا
باید هميشه 6۲ (51 را صریحاً فراخوانی کرد.
صفحه 6:
سازنده ی ۳۱۵۱۲۱۷۱۸۳۵۱۵۷۵۵
public class HourlyEmployee extends Employee
{
private double wageRate;
private double hours; // for the month
// the no-argument constructor invokes
// the Employee (super) no-argument constructor
// to initialize the Employee instance variables
// then initializes the HourlyEmployee instance variables
public HourlyEmployee( )
{
super( );
wageRate
hours =
0;
صفحه 7:
)> (
سازنده ی ۳۱۵۵۲۱۷۲۱۵۱۵۷۵6۵
// the alternative HourlyEmployee constructor invokes an
// appropriate Employee (super) constructor to initialize
// the Employee instance variables (name and date), and then
// initializes the HourlyEmployee rate and hours
public HourlyEmployee(String theName, Date theDate,
double theWageRate, double theHours)
{
super(theName, theDate);
if ((theWageRate >= 0) && (theHours >= 0))
{
wageRate = theWageRate;
hours = theHours;
+
else
{
System.exit (0);
+
+
© 7
صفحه 8:
دسترسی به متد گلاس پایه که باز نویسی شده است.
#می توان با استفاده از 06۲ [5۱ در هنگام تعریف متدها در کلاس مشتق شده.
متدهای بازنویسی شده ی گلاس پایه را نیز فراخوانی گرد.
// HourlyEmployee’s toString( ) might be
public String toString( )
{
return (super.toString() + "$" + getRate( ));
1
#به هر حال, بجز در داخل تعریف کلاس, در جای دیگری نمی توان نسخه ی کلاس,
پایه ی یک متد بازنویسی شده را فرآخوانی 255
صفحه 9:
نمی توان از 6۲( 50 به صورت تودرتو استفاده کرد
از 5۱106۲ فقط عی توان برای فراخوانی متدهای کلاس پدر استفاده کرد.
نمی توان متدهای کلاسهای دیگر اجداد را توسط 06۲ [5۱ فراخوانی نمود.
#به عنوان مثال, کد زیر غلط است.
super.super.toString() // ILLEGAL!
صفحه 10:
هر شی از کلاس هشتق شده بیش از یک نوع دارد
* هر شى كه از نوع كلاس مشتق شده باشد. از نوع كلاس
يايه ى مربوطه هم هست.
© بطور كلى: هر شى كلاس مشتق شده از نوع تمام اجداد
#بنابراین, اين شى را مى توان به هر متغييرى از نوع اجداد نيز
صفحه 11:
هر شى از كلاس مشتق شده بيش از یک نوع دارد
* يعنى می توان شی کلاس مشتق, شده را بعنوان پارامتر به جاى كلاسهاى
اجدادش به متدها ارسال گرد.
در حقیقت. شی کلاس, مشتق شده را می توان در هر جایی که یک شی از نوع
اجدادش استفاده شده است, استفاده نمود.
#دقت کنید در این رابطه حالت برعکس صحیح نیست.
* يعنى نمی توان یک شی از نوع اجداد را به جای يك شى كلاس مشتق شده
استفاده کرد.
صفحه 12:
خلاصه ی کلاس پایه/مشتق شده
فرض کنید که کلاس از کلاس 5 مشتق شده است.
| هر شی از نوع ]از نوع 3 نیز هست ولی عکس آن صحیح
نیست.
| دا نسخمی خصوصیتر 5 لست
هر جایی که از 5 استفاده شده است. از (] نیز می توان
استفاده گرد.
صفحه 13:
دسترسی ۴۳۵۲۵6۲۵۵
#می توان هنگام تعریف یک متدیا متغییر از 0۳0۵/6160 به جای
Yl ya -a}S aalaiwl private L public صورت. می توان در
جاهای زیر آنرا با اسم فراخوانی گرد:
#داخل تعریف کلاس خودش
#داخل هر کلاسی که از آن مشتق می شود.
#داخل هر کلاسی که بسته ی آن با کلاس ما یکسان است.
#حفاظت 0۲0166760 نسبت به 0۲1۷۵16 ضعیف است.
*#می توان با تعریف کلاسهای مشتق شده متغییر های ۵۲۵۲6160 را
فراخوانی کرد.
#*بنابراین, متغییرهای خصوصی را معصولً با 0۲016160 علاعت نمی زنند.
صفحه 14:
راهنمایی: متغییرهای استاتیک به ارث برده می شوند.
متغییرهای استاتیک کلاس پایه توسط همه ی گلاسهای مشتق شده به
ارث برده می شوند.
#معناى protected g public, private برای متغییرهای استاتیک
شبیه متغییرهای معصولی است.
صفحه 15:
Object ys
#در جاوا كلاس 00[6»1 جد تمام کلاسها است.
#هر کلاسی از نوع كلاس cum ji Object
© اكر كلاسى بصورت يايه تعریف شود و از هیچ کلاسی ارث بری نگند؛ آن کلاس
کماکان و بطور خودکار از نوع کلاس ]0[661 است.
© كلاس 601ز۵ در بسته ی 3.13119 3۷ قرار دارد که همیشه بصورت
اتوصاتیک فراخوانی می شود.
#لذا می توان متدهای نوشت که آرگومان آنها از نوع Object باشد.
#این پارامتر را بعداً می توان با هر شی از هر کلاسی جایگزین کرد.
صفحه 16:
Object ys
#علاس 0061 متدهایی دارد که توسط تمام کلاسهای
دیگر به ارث برده می شود.
#مثل متدهای 60۱315 و toString
#هر شی این متدها را از اجداد خود به ارث می برد.
* مى توان اين متدها را در کلاسهای مشتق شده بازنویسی
aps
بعضی کتابخانه های جاوا فرض مى كنند كه اين متدها حتعاً
بازنويسى مى كردند.
صفحه 17:
روش درست تعريف كلاس equals
*چون متد 601۵15 همیشه از 661 [0 ۵ به ارث برده صی شود. متدهایی
شبيه این متد آنرا بارگذاری می کنند.
public boolean equals(Employee otherEmployee)
fom a}
؟اها این عتد به جای بارگذاری, باید بازنویسی شود
public boolean equals(Object otherObject)
fi cae its ee J
صفحه 18:
روش درست تعریف کلاس 6001515
#نسخه ی بازنویسی شده ی متد ۵05 باید دارای شرایط
زیر باشد:
*پارامتر 661 [0116۲00 از نوع 60۱/815 را باید با
تبدیل نوع تغيير دهد.
*به هر حال متد جديد اين كار را فقط در صورتی باید انجام
دهد که ]661 [ 01۱6۲۳0 یک شی از همین کلاس
باشد و مقدار آن |۲۱۱۱1 نباشد.
#بايد تصام متغییرهای هر دو شی را با هم مقایسه نماید.
صفحه 19:
یک متد 60015 بهتر برای کلاس 66 ۴۲۱۵۱0۷
public boolean equals(Object otherObject)
if(otherObject == null)
return false;
else if(getClass( ) != otherObject.getClass( ))
return false;
else
{
Employee otherEmployee = (Employee) otherObject;
return (name.equals(otherEmployee.name) &
hireDate. equals (otherEmployee.hireDate) );
صفحه 20:
getClass a
#هر شی متد 61855 61 9]را از کلاس 66 [ 00 به ارث می برد.
*اين متد بصورت 1 71.113 تعریف شده است, یعنی قابل بازنویسی نیست.
* فراخوانی 5 6135 9[] باعث می شود که کلاس مورد استفاده در
هنگام ایجاد شی [توسط دستور 6۷۷] برگردد.
* خروجى اين متد را می توان با عملگرهای -- و |- مقایسه نمود تا ببینیم که
كلاس دو شى برابر هستند يا نه؟
(Object1.getClass() == Object2.getClass())