کلاس HourlyEmployee

Download Report

Transcript کلاس HourlyEmployee

‫ارث بری‬
‫استفاده ی مجدد از کالس توسط وراثت‬
‫مظفر بگ محمدی‬
‫دانشگاه ایالم‬
‫استفاده ی مجدد از کالس‬
‫‪ ‬ما دیدیم که چگونه کالسها و کد آنها در ترکیب استفاده شدند‪.‬‬
‫‪ ‬در ترکیب‪ ،‬ش ی یک یا چند ش ی دیگر را به عنوان متغییر استفاده می کرد‪.‬‬
‫‪ ‬ترکیب رابطه ی ”داشتن“ را مدل می کند‪.‬‬
‫‪ ‬هر ‪ Person‬یک نام (‪ )String‬دارد‪.‬‬
‫‪ ‬ماشین موتور دارد‪.‬‬
‫‪ ‬کتاب صفحه دارد‪.‬‬
‫‪2‬‬
‫ارتباط اشیاء‬
‫‪ ‬ش ی می تواند نوع خاص ی از یک ش ی دیگر باشد‪.‬‬
‫‪ ‬ماشین یک وسیله ی نقلیه است‪.‬‬
‫‪ ‬مثلث یک چند ضلعی است‪.‬‬
‫‪ ‬دانشجو از نوع ‪ Person‬است‪.‬‬
‫این نوع ارتباط تحت نام ”نوعی از“ شناخته می شود‪.‬‬
‫‪ ‬در ‪ ،OOP‬این مدل ارتباطی توسط تکنیک برنامه نویس ی وراثت مدل می شود‪.‬‬
‫‪ ‬وراثت با اضافه کردن به کالسهای جاری‪ ،‬کالسهای جدیدی ایجاد می کند‪.‬‬
‫یعنی کالس جاری بدون دستکاری استفاده می شود‪.‬‬
‫‪3‬‬
‫وراثت‬
‫‪ ‬وراثت از تکنیکهای اصلی ‪ OOP‬است‪.‬‬
‫‪ ‬نحوه ی استفاده از وراثت‪:‬‬
‫‪ ‬ابتدا یک کالس عمومی تعریف می شود‪.‬‬
‫‪ ‬سپس نسخه های خصوص ی تر کالس را با اضافه کردن متدها و متغییرهای‬
‫جدید تعریف می کنیم‪.‬‬
‫‪ ‬می گوییم که نسخه ی خصوص ی متدها و متغییرهای نسخه ی عمومی‬
‫کالس را به ارث برده است‪.‬‬
‫‪4‬‬
‫کالسهای مشتق شده‬
‫ً‬
‫‪ ‬معموال هنگام طراحی بعض ی کالسها وراثت بصورت طبیعی خود را نمایان می کند‪:‬‬
‫‪ ‬در برنامه ی حقوق کارمندان یک اداره دو نوع کارمند داریم‪ :‬ساعتی و حقوقی‬
‫‪ ‬کارمندان ساعتی می توانند پاره وقت یا کامل باشند‪.‬‬
‫‪ ‬کارمندان با حقوق ماهانه ی مشخص نیز به دو دسته ی فنی و اداری تقسیم می شوند‪.‬‬
‫‪5‬‬
‫کالسهای مشتق شده‬
‫‪ ‬تمام کارمندان مشخصات مشترکی دارند‪:‬‬
‫‪ ‬اسم و تاریخ استخدام‬
‫‪ ‬متدهای دسترس ی و تغییر نام و تاریخ استخدام‬
‫‪ ‬بعض ی کارمندان مشخصات خصوص ی تری دارند‪:‬‬
‫‪ ‬میزان پرداخت‬
‫‪ ‬کارمند ساعتی‪ :‬دستمزد هر ساعت کار‬
‫‪ ‬کارمند پیمانی‪ :‬میزان پایه ی حقوق‬
‫‪ ‬نحوه ی محاسبه میزان پرداختی برای این دو نوع کارمند متفاوت است‪.‬‬
‫‪6‬‬
‫وراثت و ‪OOP‬‬
‫‪ ‬وراثت نوعی انتزاع است که به منظور‪:‬‬
‫‪ ‬اشتراک مشابتهای بین کالسها (مثل نام و تاریخ استخدام) و‬
‫‪ ‬حفظ تفاوتها (مثل نحوه محاسبه ی میزان پرداختی) انجام می شود‪.‬‬
‫‪ ‬وراثت به ما اجازه می دهد که کالسها را بصورت خانواده هایی از نوع مرتبط‬
‫دسته بندی کنیم و متدها و خصوصیات مشترک آنها را به اشتراک بگذاریم‪.‬‬
‫‪7‬‬
‫کالسهای عمومی‬
‫‪ ‬می توان برای تمام کارمندان یک کالس عمومی به نام ‪ Employee‬تعریف‬
‫کرد‪.‬‬
‫‪ ‬سپس می توان کارمندان ساعتی و پیمانی را از روی این کالس تعریف‬
‫کرد‪.‬‬
‫‪ ‬سپس می توان از کالس ‪ HourlyEmployee‬برای تعریف کالس‬
‫‪ PartTimeHourlyEmployee‬استفاده کرد و ‪....‬‬
‫‪8‬‬
A Class Hierarchy
9
Employee ‫کالس‬
/**
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
{
private String name;
private Date hireDate;
// no-argument constructor
public Employee( )
{
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)
10
Employee ‫کالس‬
// some
public
public
public
public
accessors and mutators
String getName( )
Date getHireDate( )
void setName(String newName)
void setHireDate(Date newDate)
{ /* code here */ }
{ /* code here */ }
{ /* code here */ }
{ /* code here */ }
// everyone gets the same raise
public double calcRaise( )
{ return 200.00; }
// toString and equals
public String toString( )
public boolean equals(Employee otherEmployee)
{ /* code here */ }
} // end of Employee Class
11
{ /* code here */ }
‫کالسهای مشتق شده‬
‫‪ ‬چون کارمند ساعتی نوعی از کارمند است‪ ،‬می گوییم که از کالس ‪Employee‬‬
‫مشتق شده است‪.‬‬
‫‪ ‬کالس مشتق شده را می توان با اضافه کردن متد یا خصوصیت به یک کالس‬
‫جاری تعریف نمود‪.‬‬
‫‪ ‬کالس مشتق شده از کالس مبنا مشتق می شود‪.‬‬
‫‪ ‬هنگام تعریف کالس مشتق شده باید عبارت ‪extends‬‬
‫‪ BaseClass‬استفاده شود‪.‬‬
‫‪public class HourlyEmployee extends Employee‬‬
‫‪12‬‬
HourlyEmployee ‫کالس‬
/**
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)
13
HourlyEmployee ‫کالس‬
// accessors and mutator specific to HourlyEmployee
public double getRate( )
}
public double getHours( )
}
public void setHours(double hoursWorked)
}
public void setRate(double newWageRate)
}
{ /* code here */
{ /* code here */
{ /* code here */
{ /* code here */
// toString and equals specific for HourlyEmployee
public String toString( )
{ /* code here */
}
public boolean
equals(HourlyEmployee otherHE) { /* code here */ }
} // end of HourlyEmployee Class
14
‫زیر کالس‬
‫‪ ‬به کالس مشتق شده زیر کالس هم می گویند‪.‬‬
‫‪ ‬کالس والد تحت اسم کالس مبنا یا کالس پایه نیز شناخته می شود‪.‬‬
‫‪ ‬زیر کالس موارد زیر را از کالس مبنا به ارث می برد‪:‬‬
‫‪ ‬متدهای عمومی‬
‫‪ ‬متغیرهای عمومی و خصوص ی‬
‫‪ ‬متغیرهای عمومی و خصوص ی استاتیک‬
‫‪ ‬کالس مشتق شده می تواند متغییر‪ ،‬متغییر استاتیک و متد داشته‬
‫باشند‪.‬‬
‫‪15‬‬
HourlyEmployee ‫استفاده از‬
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
System.out.println("joe's 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 );
}
}
16
‫بازنویس ی یک متد‬
‫‪ ‬کالس مشتق شده می تواند کالسهای به ارث برده شده را بازنویس ی کند‪.‬‬
‫‪ ‬برای بازنویس ی یک متد‪ ،‬آن متد در کالس مشتق شده دوباره تعریف و پیاده می شود‪.‬‬
‫‪ ‬بعنوان مثال‪ ،‬کالس ‪ HourlyEmployee‬روش خود را برای محاسبه ی افزایش‬
‫حقوق دارد‪ .‬لذا‪ ،‬متد ) (‪ calcRaise‬از کالس ‪ Employee‬را دوباره باز نویس ی می کند‪.‬‬
‫‪17‬‬
‫مثال بازنویس ی‬
public class Employee
{
....
public double calcRaise( ) { return 200.00; }
}
public class HourlyEmployee extends Employee
{
. . . .
// overriding calcRaise – same signature as in Employee
public double calcRaise( ) {return 500.00; }
}
:‫حاال کد‬
HourlyEmployee joe = new HourlyEmployee( );
double raise = joe.calcRaise( );
.‫ فراخوانی می کند‬HourlyEmployee ‫ را از کالس‬calcRaise ‫متد‬
.‫ امضای متد در کالس مشتق شده باید با امضای متد در کالس پایه یکسان باشد‬،‫جهت بازنویس ی یک متد در کالس مشتق شده‬
18
‫بازنویس ی و بارگذاری مجدد‬
‫‪ ‬دقت کنید که بازنویس ی و بارگذاری مجدد متد را با هم قاطی نکنید‪.‬‬
‫‪ ‬در بازنویس ی متد‪ ،‬امضای متد در کالس مشتق شده با امضای متد در کالس‬
‫پایه یکسان است‪.‬‬
‫‪ ‬اما اگر امضای متدی در کالس مشتق شده یا در کالس پایه با امضای متد‬
‫در کالس پایه متفاوت باشد (اما اسم متدها یکسان باشد)‪ ،‬می گوییم که‬
‫متد دوباره بارگذاری شده است‪.‬‬
‫‪ ‬دقت کنید که در هر دو حالت‪ ،‬کالس مشتق شده به متد کالس پایه‬
‫دسترس ی دارد و می تواند از آن استفاده کند‪.‬‬
‫‪19‬‬
‫اصالح کننده ی ‪final‬‬
‫‪ ‬اگر کلمه ‪ final‬قبل از تعریف متد قرار گیرد‪ ،‬متد را نمی توان در کالسهای مشتق‬
‫شده بازنویس ی کرد‪.‬‬
‫‪ ‬اگر کلمه ‪ final‬قبل از تعریف کالس قرار گیرد‪ ،‬نمی توان از آن کالس اشتقاق نمود و‬
‫ارث بری کرد‪.‬‬
‫‪20‬‬
‫استفاده از متغییرهای خصوص ی کالس پایه‬
‫‪ ‬در متدهای کالس مشتق شده‪ ،‬نمی توان متغییر خصوص ی را با اسم فراخوانی‬
‫کرد‪.‬‬
‫‪ ‬یک ش ی از نوع ‪HourlyEmployee‬به متغییر ‪ hireDate‬خصوص ی دسترس ی ندارد اگر‬
‫چه از کالس پایه ی ‪ Employee‬ارث بری نموده است‪.‬‬
‫‪ ‬اما با استفاده از متدهای ‪ accessor‬و ‪ mutator‬تعریف شده در کالس پایه‪،‬‬
‫می توان در کالس مشتق شده به متغییرهای کالس پایه دسترس ی داشت‪.‬‬
‫‪ ‬یک ش ی از نوع ‪ HourlyEmployee‬با استفاده از متدهای ‪ getHireDate‬و‬
‫‪setHireDate‬به متغییر ‪ hireDate‬خصوص ی دسترس ی دارد‪.‬‬
‫‪21‬‬
‫استفاده از متغییرهای خصوص ی کالس پایه ‪...‬‬
‫‪ ‬اگر کالس مشتق شده به متغییرهای خصوص ی دسترس ی داشته باشد‪،‬‬
‫‪ ‬هر کس که بخواهد اصول کپسوله سازی را نقض کند‪ ،‬می تواند با‬
‫استفاده از وراثت از روی کالس پایه یک کالس مشتق شده بسازد و به‬
‫متغییرهای خصوص ی کالس پایه دسترس ی داشته باشد‪.‬‬
‫ً‬
‫‪ ‬یعنی ممکن است به اشتباه یا عمدا متغییرهای خصوص ی را بصورت‬
‫نادرست تغییر داد‪.‬‬
‫‪22‬‬
‫دلیل عدم ارث بری متدها در کالسهای مشتق شده‬
‫‪ ‬متدهای خصوص ی کالس پایه نیز مثل متغییرهای خصوص ی قابل ارث بری‬
‫نیستند‪.‬‬
‫ً‬
‫‪ ‬متد خصوص ی کامال غیر قابل دسترس ی است مگر این که بصورت غیر مستقیم‬
‫صدا زده شود‪.‬‬
‫‪ ‬یعنی ما متدی عمومی از کالس پایه را صدا بزنیم و داخل آن متد یک متد خصوص ی‬
‫کالس پایه صدا زده شود‪.‬‬
‫‪ ‬این موضوع ایجاد اشکال نمی کند زیرا متدهای خصوص ی بعنوان متد کمکی‬
‫تعریف شده اند و متد اصلی نیستند‪.‬‬
‫‪23‬‬