کلاس 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