صفحه 1:
ارث برى
استفاده ى مجدد ازكلاس توسط وراثت
مظفر بگ محمدی
دانشكاه ايلام
صفحه 2:
استفاده ی مجدد از کلاس
ما دیدیم که چگونه کلاسها و کد آنها در ترکیب استفاده شدند.
“در
ب, شی یک يا چند شی دیگر را به عنوان متغییر استفاده می
کرد.
شتن" را مدل می کند.
#هر ۲6۲50 یک نام (عص50) دارد.
#ماشین موتور دارد.
#تركيب را بطه ی "داشتن" را
#کتاب صفحه دارد.
صفحه 3:
ارتباط اشیاء
© شى مى تواند نوع خاصی از یک شی دیگر باشد.
#ماشین یک وسیله ی نقلیه است.
٩مثلث یک چند ضلعی است.
#دانشجو از نوع «col Person
این نوع ارتباط تحت نام "نوعی از" شناخته می شود.
#در OOP این مدل ارتباطی توسط تکنیک برنامه نویسی ورائت
مدل می شود.
ورائت با اضافه کردن به کلاسهای جاری, کلاسهای جدیدی
ایجاد می کند. یعنی کلاس جاری بدون دستکاری اسنفاده می
شود.
@
صفحه 4:
ورائت
#ورائت از تکنیکهای اصلی 00۳ است.
#نحوه ی استفاده از ورائت:
#ابتدا یک کلاس عمومی تعریف می شود.
سپس نسخه های خصوصی تر کلاس را با اضافه کردن متدها
و متغییرهای جدید تعریف می کنیم.
#می گوییم که نسخه ی خصوصی مندها و متغییرهای نسخه
ی عمومی کلاس را به ارث برده است.
صفحه 5:
کلاننیهای مشنقق نشنده
#معمولا هنگام طراحی بعضی کلاسها ورائت بصورت طبیعی خود را
نمایان می کند:
#در برنامه ی حقوق کارمندان یک اداره دو نوع کارمند داریم: ساعتی و
حقوقی
* کارمندان ساعتی می توانند پره وقت یا کامل باشند.
*کارمندان با حقوق ماهانه ی مشخص نیز به دو دسته ی فنی و اداری
تقسیم می شوند.
صفحه 6:
کلاسهای مشتق شده
© تمام کارمندان مشخصات مشترکی دارند:
#اسم و تاریخ استخدام
متدهای دسترسی و تغییر نام و تاریخ استخدام
#بعضی کارمندان مشخصات خصوصی تری دارند:
#میزان پرداخت
کارمند ساعتی: دستمزد هر ساعت کار
کارمند پیمانی: میزان پایه ی حقوق
#نحوه ی محاسبه میزان پرداختی برای این دو نوع کارمند
متفاوت است.
صفحه 7:
ورائت و 00۳
#ورائت نوعی انتزاع است که به منظور:
اشتراک مشابتهای بین کلاسها (مثل نام و تاريخ استخدام) و
حفظ تفاوتها (متل نحوه محاسبه ی میزان پرداختی) انجام می
شود.
#ورائت به ما اجازه می دهد که کلاسها را بصورت خانواده هایی از
نوع مرتبط دسته بندی کنیم و متدها و خصوصیات مشترک آنها
را به اشتراک بگذاریم.
صفحه 8:
کلاسهای عمومی
#می توان برای تمام کارمندان یک کلاس عمومی به نام
6 تعریف کرد.
سپس می توان کارمندان ساعتی و پیمانی را از روی این
كلاس تعريف كرد.
سيس مى توان از كلاس ©6لا011/511010ا10! براى تعريف
کلاس PartTimeHourlyEmployee استفاده کرد و ....
صفحه 9:
Display 7.1 A Class Hierarchy
===:
A Class Hierarchy
صفحه 10:
Employee pS 1
بر
Class Invariant: All objects have a name string and hire date.
A name string of "No name" indicates no real name specified yet.
A hire date of Jan 1, 1000 indicates no real hire date specified yet.
*/
public class Employee
3
private String name;
private Date hireDate;
// 0-argument constructor
public Employee( )
1
name = "No name";
hireDate = new Date("Jan", 1, 1000); //Just a placeholder
}
// alternate constructor
public Employee(String theName, Date theDate) { /* code here */ }
// copy constructor
public Employee(Employee originalobject) { /* code here */ }
(continued)
صفحه 11:
كلاس ۴۲۳۱010766
// some accessors and mutators
String getName( ){ /* code here */ }
Date getHireDate( ) { /* code here */ }
void setName(String newName) { /* code here */ }
void setHireDate(Date newDate) { /* code here */
public
public
public
public
// everyone gets the same raise
public double calcRaise(
{ return 200.00; }
// toString and equals
String toString( ) { /* code here */ }
boolean equals(Employee otherEmployee)
public
public
{ /* code here */ }
} // end of Employee Class
صفحه 12:
کلانسهای مشتتق شذه
#چون کارمند ساعتی نوعی از کارمند است, می گوییم که از کلاس
6 مشتق شده است.
9 کلاس مشتق شده را می توان با اضافه کردن متد یا خوصصیت
به يك كلاس جارى تعریف نمود.
© كلاس مشتق شده از كلاس مبنا مشتق مى شود.
© هنكام تعريف كلاس مشتق شده باید عبارت extends
65 استفاده شود.
public class HourlyEmployee extends Employee
صفحه 13:
HourlyEmployee كلاس
pe
Class Invariant: All objects have a name string, hire date,
nonnegative wage rate, and nonnegative number of hours worked. */
public class HourlyEmployee extends Employee
{
// instance variables unique to HourlyEmployee
private double wageRate;
private double hours; //for the month
// no-argument Constructor
public HourlyEmployee( ) { /* code here */}
// alternative constructor
public HourlyEmployee(String theName, Date theDate,
double theWageRate, double theHours) { /* code here */}
// copy constructor
public HourlyEmployee(HourlyEmployee originalHE) { /* code here */}
(continued)
صفحه 14:
کلاس ۲۱۵۱۲۱۲۳۱۴0۱0۲66
// accessors and mutator specific to HourlyEmployee
public double getRate( ) { /* code here
Public double getHiours( ) { /* code here
public wold Sethours (dauble HourswerKed) { /* code here
public void setRate(double newWageRate) { /* code here */ }
// toString and equals specific for HourlyEmployee
foblic String toStringt ) { /* code here
public boolean
equals(HourlyEmployee otherHE) { /* code here */ }
} // end of HourlyEmployee Class
صفحه 15:
زير كلاس
#به کلاس مشتق شده زیر کلاس هم می گویند.
* كلاس والد تحت اسم كلاس مبنا يا كلاس بايه نيز
شناخته 2
©زير كلاس ae زير را از كلاس مبنا به ارث می برد:
© متدهاى عمومى
© متغيرهاى عمومى و خصوصى
© متغيرهاى عمومى و خصوصى استاتيك
© كلاس مشتق شده مى تواند متغيير, متغيير استاتيك و
متد دآشته باشند.
صفحه 16:
اعضایی که به ارث برده می شوند.
A derived class automatically has all of the @'
® instance variables,
® static variables, and
® public methods
of the base class
|® Definitions for the inherited variables and methods
do not appear in the derived class.
® The code is reused without having to explicitly copy it,
unless the creator of the derived class redefines one or more
of the base class methods.
صفحه 17:
1 استفاده از ۲01076 ۲۲0
public class HourlyEmployeeExample
public static void main(String[] args)
HourlyEmployee joe
new HourlyEmployee(“Joe Worker", new Date(1, 1, 2004), 50.50, 160);
// getName is defined in Employee
رن name is
+ joe.getName( ));
// setName is defined in Employee
System.out.printLn("Changing joe's name to Josephine.");
joe. setName(" Josephine") ;
// setRate is specific for HourlyEmployee
System.out.println(“Giving Josephine a raise”
joe.setRate( 65.00 );
// calcRaise is defined in Employee
double raise = joe.calcRaise( );
System.out.println(“Joe’s raise is
+ raise );
صفحه 18:
بازنویسی یک متد
#کلاس مشتق شده می تواند کلاسهای به ارث برده شده را بازنویسی
کند.
# برای بازنویسی یک مند, آن متد در کلاس مشتق شده دوباره تعریف
و پیاده می شود.
بعنوان مثال, کلاس ۳101711710010766 روش خود را برای
محاسبه ی افزايش حقوق دارد. لذا, متد 621618256( ) از کلاس
00۶ را دوباره باز نویسی می کند.
صفحه 19:
مثال بازنویسی
public class Employee
1
public double calcRaise( ) { return 200.00; }
/
public class HourlyEmployee extends Employee
1
// overriding calcRaise - same signature as in Employee
public double calcRaise( ) {return 500.00; }
حالا کد:
HourlyEmployee joe = new HourlyEmployee( );
double raise = joe.calcRaise( );
cal cRaise we را از کلاس 110211۱0101۵ فراخوانی می کند.
إيسى يك متد در کلاس مشتق شده, امضای متد در لاس مشتق شده باید با امضای متد در کلاس پایه
اشد
صفحه 20:
بازنویسی و بارگذاری مجدد
© دقت کنید که بازنویسی و بارگذاری مجدد متد را با هم قاطی
#در بازنویسی متد, امضای مند در کلاس مشتق شده با امضای
متد در کلاس پایه یکسان است.
#اما اگر امضای متدی در کلاس مشتق شده یا در کلاس پایه با
امضای متد در کلاس پایه متفاوت باشد (اما اسم متدها
یکسان باشد), می گوییم که متد دوباره بازگذاری شده است.
#دقت کنید که در هر دو حالت, کلاس مشتق شده به متد
کلاس پایه دسترسی دارد و می تواند از آن استفاده کند.
صفحه 21:
اصلاح کننده ی final
#اكر کلمه 1021] قبل از تعریف متد قرار گیرد, متد را نمی توان در
کلااسهای مشتق شده بانویسی کرد.
#اكر كلمه 5101 قبل از تعریف کلاس قرار گیرد, نمی توان از آن
کلاس اشتقاق نمود و ارث بری کرد.
صفحه 22:
استفاده از متغییرهای خصوصی کلاس پایه
#در متدهای کلاس مشتق شده, نمی توان متغییر خصوصی را با
اسم فراخوانی کرد.
#یک شی از نوع 5۱010766 ات۲10 به متغییر 7612246 خصوصی
دسترسى ندارد اكر جه از كلاس يايه ى 85331107766 ارث بری نموده است.
#اما با استفاده از متدهای 266065501 و 10121210۲ تعريف شده
در كلاس پایه, می توان در كلاس مشتق شده به متغییرهای
کلاس پایه دسترسی داشت.
#یک شی از نوع ۴1001۱0107766 با استفاده از متدهای
setHireDate 5 getHireDate به متغییر 76](246 خصوصی
دسترسی دارد.
صفحه 23:
استفاده از متغییرهای خصوصی کلاس پایه ...
#اكر كلاس مشتق شده به متغییرهای خصوصی دسترسی
داشته باشد,
#هر کس که بخواهد اصول کپسوله سازی را نقض کند, می
تواند با استفاده از ورائت از روی کلاس پایه یک کلاس
مشتق شده بسازد و به متغییرهای خصوصی Aah WIS
دسترسی داشته باشد.
Cull Soo au? به اشتباه یا عمداً متغییرهای خصوصی را
بصورت نادرست تغییر داد.
صفحه 24:
دلیل عدم ارث بری متدها در کلاسهای مشتق شده
#متدهای خصوصی کلاس پایه نیز مثل متغییرهای خصوصی قابل
ارث بری نیستند.
متد خصوصی کاملاً غیر قابل دسترسی است مگر این که بصورت
غیر مستقیم صدا زده شود. ۲
#یمنی ما مندي عمومی از کلاس پایه را صدا بزنيم و داخل آن متد يك
متد خصوصی کلاس پایه صدا زده شود.
#اين موضوع ایجاد اشکال نمی کند زیرا متدهای خصوصی بعنوان
متد کمکی تعریف شده آند و متد اصلی نیستند.