ارث بری ۲
اسلاید 1: مظفر بگ محمدیدانشگاه ایلامارث بری 2 استفاده ی مجدد از کلاس توسط وراثت
اسلاید 2: آیا اجزاء سازنده به ارث برده می شوند؟نمی توان از سازنده ی Employee برای ایجاد اشیاء HourlyEmployee استفاده کرد. ما باید برای HourlyEmployees یک سازنده ی مناسب ایجاد کنیم. اما سازنده ی HourlyEmployee چگونه می تواند متغییرهای خصوصی کلاس Employee را مقداردهی اولیه نماید در حالی که دسترسی مستقیم به آنها ندارد؟2
اسلاید 3: 3سازنده ی superکلاس مشتق شده می تواند به شکل زیر از سازنده ی کلاس پایه برای مقداردهی متغییرهای خصوصی به ارث برده شده از کلاس پایه استفاده کند. public DerivedClass(int p1, int p2, double p3) { super(p1, p2); derivedClassInstanceVariable = p3; }در مثال فوق، دستور super(p1, p2); سازنده ی کلاس پایه را فراخوانی می کند.
اسلاید 4: 4سازنده ی superبرای فراخوانی سازنده ی کلاس پایه نمی توانید از اسم کلاس پایه استفاده کنید و باید از کلمه ی کلیدی super استفاده کنید. فراخوانی super باید اولین کاری باشد که در سازنده انجام می شود. نمی توان متغییرهای کلاس را به عنوان پارامتر به super ارسال کرد.
اسلاید 5: 5سازنده ی super اگر یک کلاس مشتق شده متد super را فراخوانی نکند، سازنده ی بدون آرگومان کلاس پایه بصورت خودکار فراخوانی می گردد.اگر کلاس پایه سازنده ی بدون آرگومان نداشته باشد، منجر به تولید خطا می شود.چون متغییرهای به ارث برده شده باید مقداردهی اولیه شوند، و سازنده ی کلاس پایه برای این کار طراحی شده است، لذا باید همیشه super را صریحاً فراخوانی کرد.
اسلاید 6: سازنده ی HourlyEmployeepublic class HourlyEmployee extends Employee{private double wageRate;private double hours;// for the month// the no-argument constructor invokes// the Employee (super) no-argument constructor// to initialize the Employee instance variables// then initializes the HourlyEmployee instance variablespublic HourlyEmployee( ) { super( ); wageRate = 0; hours = 0; }6
اسلاید 7: سازنده ی HourlyEmployee// the alternative HourlyEmployee constructor invokes an// appropriate Employee (super) constructor to initialize// the Employee instance variables (name and date), and then// initializes the HourlyEmployee rate and hourspublic HourlyEmployee(String theName, Date theDate, double theWageRate, double theHours) { super(theName, theDate); if ((theWageRate >= 0) && (theHours >= 0)) { wageRate = theWageRate; hours = theHours; } else {System.exit(0); } }7
اسلاید 8: 8دسترسی به متد کلاس پایه که بازنویسی شده است.می توان با استفاده از super در هنگام تعریف متدها در کلاس مشتق شده، متدهای بازنویسی شده ی کلاس پایه را نیز فراخوانی کرد. // HourlyEmployee’s toString( ) might bepublic String toString( ){ return (super.toString() + $ + getRate( ));}به هر حال، بجز در داخل تعریف کلاس، در جای دیگری نمی توان نسخه ی کلاس پایه ی یک متد بازنویسی شده را فراخوانی کرد.
اسلاید 9: 9نمی توان از super به صورت تودرتو استفاده کرداز super فقط می توان برای فراخوانی متدهای کلاس پدر استفاده کرد. نمی توان متدهای کلاسهای دیگر اجداد را توسط super فراخوانی نمود. به عنوان مثال، کد زیر غلط است. super.super.toString() // ILLEGAL!
اسلاید 10: 10هر شی از کلاس مشتق شده بیش از یک نوع داردهر شی که از نوع کلاس مشتق شده باشد، از نوع کلاس پایه ی مربوطه هم هست. بطور کلی، هر شی کلاس مشتق شده از نوع تمام اجداد خود نیز هست .بنابراین، این شی را می توان به هر متغییری از نوع اجداد نیز منتسب کرد.
اسلاید 11: 11هر شی از کلاس مشتق شده بیش از یک نوع داردیعنی می توان شی کلاس مشتق شده را بعنوان پارامتر به جای کلاسهای اجدادش به متدها ارسال کرد. در حقیقت، شی کلاس مشتق شده را می توان در هر جایی که یک شی از نوع اجدادش استفاده شده است، استفاده نمود. دقت کنید در این رابطه حالت برعکس صحیح نیست. یعنی نمی توان یک شی از نوع اجداد را به جای یک شی کلاس مشتق شده استفاده کرد.
اسلاید 12: خلاصه ی کلاس پایه/مشتق شدهفرض کنید که کلاس D از کلاس B مشتق شده است. هر شی از نوع D از نوع B نیز هست ولی عکس آن صحیح نیست. D نسخه ی خصوصی تر B است. هر جایی که از B استفاده شده است، از D نیز می توان استفاده کرد. 12
اسلاید 13: 13دسترسی Protected می توان هنگام تعریف یک متد یا متغییر از protected به جای public یا private استفاده کرد. در این صورت، می توان در جاهای زیر آنرا با اسم فراخوانی کرد:داخل تعریف کلاس خودشداخل هر کلاسی که از آن مشتق می شود. داخل هر کلاسی که بسته ی آن با کلاس ما یکسان است. حفاظت protected نسبت به private ضعیف است. می توان با تعریف کلاسهای مشتق شده متغییرهای protected را فراخوانی کرد. بنابراین، متغییرهای خصوصی را معمولاً با protected علامت نمی زنند.
اسلاید 14: 14راهنمایی: متغییرهای استاتیک به ارث برده می شوند.متغییرهای استاتیک کلاس پایه توسط همه ی کلاسهای مشتق شده به ارث برده می شوند. معنای public, private و protected برای متغییرهای استاتیک شبیه متغییرهای معمولی است.
اسلاید 15: 15کلاس Objectدر جاوا کلاس Object جد تمام کلاسها است. هر کلاسی از نوع کلاس Object نیز هست. اگر کلاسی بصورت پایه تعریف شود و از هیچ کلاسی ارث بری نکند، آن کلاس کماکان و بطور خودکار از نوع کلاس Object است. کلاس Object در بسته ی java.lang قرار دارد که همیشه بصورت اتوماتیک فراخوانی می شود. لذا می توان متدهای نوشت که آرگومان آنها از نوع Object باشد. این پارامتر را بعداً می توان با هر شی از هر کلاسی جایگزین کرد.
اسلاید 16: 16کلاس Objectکلاس Object متدهایی دارد که توسط تمام کلاسهای دیگر به ارث برده می شود. مثل متدهای equals و toStringهر شی این متدها را از اجداد خود به ارث می برد. می توان این متدها را در کلاسهای مشتق شده بازنویسی کرد. بعضی کتابخانه های جاوا فرض می کنند که این متدها حتماً بازنویسی می گردند.
اسلاید 17: 17روش درست تعریف کلاس equalsچون متد equals همیشه از Object به ارث برده می شود، متدهایی شبیه این متد آنرا بارگذاری می کنند. public boolean equals(Employee otherEmployee){ . . . }اما این متد به جای بارگذاری، باید بازنویسی شودpublic boolean equals(Object otherObject){ . . . }
اسلاید 18: 18روش درست تعریف کلاس equalsنسخه ی بازنویسی شده ی متد equals باید دارای شرایط زیر باشد:پارامتر otherObject از نوع equals را باید با تبدیل نوع تغییر دهد. به هر حال، متد جدید این کار را فقط در صورتی باید انجام دهد که otherObject یک شی از همین کلاس باشد و مقدار آن null نباشد. باید تمام متغییرهای هر دو شی را با هم مقایسه نماید.
اسلاید 19: 19یک متد equals بهتر برای کلاس Employeepublic boolean equals(Object otherObject){ if(otherObject == null) return false; else if(getClass( ) != otherObject.getClass( )) return false; else { Employee otherEmployee = (Employee)otherObject; return (name.equals(otherEmployee.name) && hireDate.equals(otherEmployee.hireDate)); }}
اسلاید 20: 20متد getClass()هر شی متد getClass()را از کلاس Object به ارث می برد.این متد بصورت finalتعریف شده است، یعنی قابل بازنویسی نیست. فراخوانی getClass() باعث می شود که کلاس مورد استفاده در هنگام ایجاد شی (توسط دستور new) برگردد. خروجی این متد را می توان با عملگرهای == و != مقایسه نمود تا ببینیم که کلاس دو شی برابر هستند یا نه؟(Object1.getClass() == Object2.getClass())
نقد و بررسی ها
هیچ نظری برای این پاورپوینت نوشته نشده است.