Presentation is loading. Please wait.

Presentation is loading. Please wait.

مظفر بگ محمدی دانشگاه ایلام

Similar presentations


Presentation on theme: "مظفر بگ محمدی دانشگاه ایلام"— Presentation transcript:

1 مظفر بگ محمدی دانشگاه ایلام
چندریختی مظفر بگ محمدی دانشگاه ایلام

2 عناوین Binding (early and late) Upcasting and downcasting
Extensibility The final modifier with methods classes

3 چندریختی مکانیسمهای برنامه نویسی شی گرا: محصورسازی ارث بری چندریختی
توانایی تخصیص چندین معنی به یک اسم متد توسط دو مکانیسم به اسامی تقید زودهنگام و تقید دیرهنگام انجام می شود. 3

4 سلسه مراتب حیوانات Animal Dog Cat Pig

5 حیوانات سخنگو public class Animal { public void speak( int x ) { System.out.println(“ Animal “ + x );} } public class Dog extends Animal public void speak (int x ) { System.out.println( “Dog “ + x ); } public class Cat extends Animal { public void speak (int x ) { System.out.println( “Cat “ + x ); } public class Pig extends Animal { System.out.println( “Pig “ + x ); }

6 کلاس ZooDemo در این کلاس، از حیوانات می خواهیم که به بازدید کنندگان سلام کنند. public class ZooDemo { // Overloaded type-specific sayHello method // for each kind of Animal public static void sayHello( Dog d, int i ) { d.speak( i ); } public static void sayHello( Cat c, int i ) { c.speak( i ); } public static void sayHello( Pig p, int i) { p.speak( i ); } (continued)

7 کلاس ZooDemo public static void main( String[ ] args ) { Dog dusty = new Dog( ); Cat fluffy = new Cat( ); Pig sam = new Pig( ); sayHello( dusty, 7 ); sayHello( fluffy, 17 ); sayHello( sam, 27 ); } } // end Zoo Demo // output Dog 7 Cat 17 Pig 27

8 مشکلات ZooDemo ؟ کلاس ZooDemo برای هر حیوان یک نسخه ی اختصاصی از sayHello دارد. اگر حیوانات جدیدی اضافه شود چه؟ بهتر نیست که یک متد sayHello بنویسیم که برای همه حیوانات کار کند.

9 ZooDemo جدید public class ZooDemo { // One sayHello method whose parameter // is the base class works for all Animals public static void sayHello( Animal a, int x ) { a.speak( x ); } public static void main( String[ ] args ) { Dog dusty = new Dog( ); Cat fluffy = new Cat( ); Pig sam = new Pig( ); sayHello( dusty, 7 ); sayHello( fluffy, 17 ); sayHello( sam, 27 ); }

10 ZooDemo جدید چگونه کار می کند؟
فرض کنید یک متد چندین تعریف دارد. مقید کردن: به تخصیص تعریف مناسب به متد گفته می شود. تقید زودهنگام وقتی اتفاق می افتد که ما تعریف مناسب متد را در هنگام کامپایل کد به متد منتسب کنیم. در تقید زودهنگام، متدی فراخوانی می شود که متغییر مرجع مربوط به متد از آن نوع است. در مثال قبلی، کامپایلر از کجا بداند که متد sayHello کدام حیوان را فراخوانی کند؟ این کار از عهده ی کامپایلر خارج است و اگر تقید زودهنگام انجام شود، در هر سه مورد متد sayHello از کلاس Animal فراخوانی می شود.

11 تقید دیرهنگام راه حل مشکل قبلی، استفاده از تقید دیرهنگام یا پویا است.
تقید دیرهنگام: تخصیص تعریف مناسب به متد در حین اجرا و هنگام فراخوانی واقعی انجام می شود. لذا متد مناسب با توجه به نوع شی (پارامتر) ارسال شده (و نه نوع متغییر مرجع ) انتخاب و فراخوانی می شود. جاوا بجز در حالتهای زیر همیشه از تقید دیرهنگام استفاده می کند. final, private که بصورت ضمنی final است متدهای استاتیک

12 هر شی تعاریف متدهای خود را می داند.
نوع متغییر کلاس مشخص می کند که از چه متدهایی می توان با این متغییر استفاده کرد. اما، این خود شیئی که این متغییر به آن ارجاع دارد است که یکی از این متدها را مشخص می کند. یک حالت خاص از قانون فوق: نوع پارامتر کلاس مشخص می کند که از چه متدهایی می توان با این پارامتر استفاده کرد. اما، این خود آرگومان است که یکی از این متدها را مشخص می کند. 12

13 استفاده از چندریختی چگونه می توان از مزایای چندریختی استفاده کرد؟
کد را طوری بنویسید که با کلاس پایه کار کند. بعداً، تقید دیرهنگام با توجه به نوع شی، متد مناسب را انتخاب می کند.

14 حیوانات بیشتر Animal Dog Cat Pig Horse Poodle Collie

15 قابلیت گسترش فرض کنید که مطابق اسلاید قبلی، می خواهیم حیوانات بیشتری به سلسله مراتب اضافه کنیم. تمام این حیوانات (کلاسهای جدید) با متد قدیمی sayHello از کلاس ZooDemo کار می کنند چون که پارامتر sayHello از نوع مرجع کلاس پایه است. اگر اصول OOP را درست رعایت کنید، اکثر متدهای شما مثل sayHello کار می کنند و می توانند از متغییر کلاس پایه استفاده کنند. سپس تقید دیرهنگام و چندریختی، متد مناسب برای اجرا را مشخص می کنند. این برنامه قابل توسعه است زیرا شما می توانید بدون تغییر کد موجود، از کلاس پایه کلاسهای جدیدی مشتق کرده و عملکردهای جدیدی به آنها اضافه کنید.

16 اصلاح کننده ی final وقتی متدی با final علامت زده می شود، نمی توان متد را بازنویسی کرد. لذا کامپایلر می تواند در مورد متد final از تقید زودهنگام استفاده کند. public final void someMethod() { } نمی توان از کلاسی که با final علامت زده شده است کلاس جدیدی مشتق کرد. 16

17 تقید دیرهنگام toString
System.out.println(objectName); مثل این تکه کد: Animal max = new Animal( ); System.out.println(max); این مثال بدلیل وجود خاصیت تقید دیرهنگام کار می کند. 17

18 تقید دیرهنگام toString
تعریف متد println از پارامتری از نوع Object استفاده می کند. public void println(Object theObject) { System.out.println(theObject.toString()); } در مقابل، این متد نسخه ای از println را فراخوانی می کند که یک ارگومان String می پذیرد. دقت کنید که println قبل از تعریف کلاس Animal وجود داشته است. به خاطر تقید دیرهنگام، متد toString از کلاس Animal ( نه از کلاس Object ) فراخوانی می شود. 18

19 Upcasting و Downcasting
تعمیم وقتی اتفاق می افتد که یک شی از کلاس مشتق شده به یک شی از کلاس پایه (یا یکی از اجداد) منتسب می شود. Animal animalVariable; // base class Dog dogVariable = new Dog( ); // derived class animalVariable = dogVariable; // upcasting animalVariable.speak(42); // “Dog 42” is printed یا می توانیم مستقیما بنویسیم: Animal animal = new Dog( ); اینجا تقید دیرهنگام باعث می شود که از متد speak کلاس Dog استفاده شود. 19

20 Upcasting و Downcasting
تبدیل به نوع جزیی تر وقتی انجام می شود که از کلاس پایه (یا یکی از اجداد) به کلاس مشتق شده برویم. باید با احتیاط از این موضوع استفاده شود. اکثر اوقات، این موضوع قانونی نیست. dogVariable = //will produce (Dog)animalVariable; //run-time error dogVariable = animalVariable //will produce //compiler error اما حالاتی وجود دارد که downcasting ضروری است، مثل متد equals در هر کلاس: Dog otherDog = (Dog)otherObject; //downcasting 20


Download ppt "مظفر بگ محمدی دانشگاه ایلام"

Similar presentations


Ads by Google