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