کامپیوتر و IT و اینترنتعلوم مهندسی

ارث بری استفاده ی مجدد از کلاس توسط وراثت

صفحه 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:
دلیل عدم ارث بری متدها در کلاسهای مشتق شده #متدهای خصوصی کلاس پایه نیز مثل متغییرهای خصوصی قابل ارث بری نیستند. متد خصوصی کاملاً غیر قابل دسترسی است مگر این که بصورت غیر مستقیم صدا زده شود. ۲ #یمنی ما مندي عمومی از کلاس پایه را صدا بزنيم و داخل آن متد يك متد خصوصی کلاس پایه صدا زده شود. #اين موضوع ایجاد اشکال نمی کند زیرا متدهای خصوصی بعنوان متد کمکی تعریف شده آند و متد اصلی نیستند.

ارث بری استفاده ی مجدد از کالس توسط وراثت مظفر بگ محمدی دانشگاه ایالم استفاده ی مجدد از کالس ما دیدیم که چگونه کالسها و ک د آنها در ترک یب استفاده شدند. ‏در ترک یب ،شی یک یا چند شی دیگر را به عنوان متغییر استفاده می کرد. ترک یب را بطه ی ”داشتن“ را مدل می کند. ‏هر 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( ) { /* code here */ } { /* code here */ void setName(String newName) void setHireDate(Date newDate) { /* 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 /* code here /* code here /* code here 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 .اعضایی که به ارث برده می شوند 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. 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( 65.00 ); // calcRaise is defined in Employee double raise = joe.calcRaise( ); System.out.println(“Joe’s raise is “ + raise ); } } 17 بازنویسی یک متد کالس مشتق شده می تواند ک السهای به ارث برده شده را بازنویسی کند. برای بازنویسی یک متد ،آن متد در ک الس مشتق شده دوباره تعریف و پیاده می شود. ‏بعنوان مثال ،کالس HourlyEmployeeروش خود را برای محاسبه ی افزایش حقوق دارد .لذا ،متد ) (calcRaiseاز کالس Employeeرا دوباره باز نویسی می کند. 18 مثال بازنویسی 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 متد امضای متد در ک الس مشتق شده باید با امضای متد در ک الس پایه،جهت بازنویسی یک متد در ک الس مشتق شده یکسان باشد. 19 بازنویسی و بارگ ذاری مجدد دقت کنید ک ه بازنویسی و بارگ ذاری مجدد متد را با هم قاطی نکنید. در بازنویسی متد ،امضای متد در ک الس مشتق شده با امضای متد در ک الس پایه یکسان است. اما اگر امضای متدی در ک الس مشتق شده یا در ک الس پایه با امضای متد در ک الس پایه متفاوت باشد (اما اسم متدها یکسان باشد) ،می گوییم که متد دوباره بارگ ذاری شده است. دقت کنید ک ه در هر دو حالت ،کالس مشتق شده به متد ک الس پایه دسترسی دارد و می تواند از آن استفاده کند. 20 اصالح کننده ی final ‏اگر ک لمه finalقبل از تعریف متد قرار گ یرد ،متد را نمی توان در کالسهای مشتق شده بازنویسی کرد. ‏اگر ک لمه finalقبل از تعریف کالس قرار گ یرد ،نمی توان از آن کالس اشتقاق نمود و ارث بری کرد. 21 استفاده از متغییرهای خصوصی کالس پایه در متدهای کالس مشتق شده ،نمی توان متغییر خصوصی را با اسم فراخوانی کرد. ‏یک شی از نوع HourlyEmployeeبه متغییر hireDateخصوصی دسترسی ندارد اگر چه از کالس پایه ی Employeeارث بری نموده است. ‏اما با استفاده از متدهای accessorو mutatorتعریف شده در کالس پایه ،می توان در ک الس مشتق شده به متغییرهای کالس پایه دسترسی داشت. ‏یک شی از نوع HourlyEmployeeبا استفاده از متدهای getHireDate و setHireDateبه متغییر hireDateخصوصی دسترسی دارد. 22 استفاده از متغییرهای خصوصی کالس پایه ... ‏اگر ک الس مشتق شده به متغییرهای خصوصی دسترسی داشته باشد، ‏هر ک س که بخواهد اصول کپسوله سازی را نقض کند ،می تواند با استفاده از وراثت از روی کالس پایه یک کالس مشتق شده بسازد و به متغییرهای خصوصی کالس پایه دسترسی داشته باشد. ‏یعنی ممکن است به اشتباه یا عمدًا متغییرهای خصوصی را بصورت نادرست تغییر داد. 23 دلیل عدم ارث بری متدها در ک السهای مشتق شده ‏متدهای خصوصی کالس پایه نیز مثل متغییرهای خصوصی قابل ارث بری نیستند. ‏متد خصوصی کامًال غیر قابل دسترسی است مگر این که بصورت غیر مستقیم صدا زده شود. ‏یعنی ما متدی عمومی از کالس پایه را صدا بزنیم و داخل آن متد یک متد خصوصی کالس پایه صدا زده شود. ‏این موضوع ایجاد اشکال نمی کند زیرا متدهای خصوصی بعنوان متد ک مکی تعریف شده اند و متد اصلی نیستند. 24

51,000 تومان