PDA

View Full Version : پلی مورفیسم



Sajjad1364
پنج شنبه 04 مرداد 1386, 20:08 عصر
در جهان واقعی هنگامیکه شیی از چند شیء ارث می برد ، رفتارها و خصوصیات مربوط به هر شیء والد می توانند توسط شیء فرزند تغییر، بهبود وجانشین گردند.حالتی را درنظر بگیرید که چند شیء حاوی رفتارهایی مشابه باشند .( فقط نام رفتارها مشابه باشند، نه نحوه پیاده سازی آنها)دراینصورت شیء فرزند میخواهد رفتارهای مشابه را که از چند شیء والد خود به ارث برده مثلا جایگزین نماید.این حالت فوق العاده عام در وراثت چندگانه زبانهای شیء گرای امروزی قابل پیاده سازی نیست.در واقع وراثت چندگانه امروزی اجازه هرگونه دخل وتصرف در اشیاء والد پیاده سازی شده در شیء فرزند را نمی دهد .بوضوح می توان اینگونه استنباط کرد که، وراثت چندگانه فقط در سطح میباشد و در عمق وجود خارجی ندارد‼‼‼.به این معنا که در وراثت چندگانه هیچ چیز مشابه که در تمام اشیاء والد موجود است را نمی توانید در شیء فرزند که از اشیاء والدش به ارث برده دوباره پیاده سازی کنید و یا حتی تغییر دهید.
به این مثال توجه کنید:
با توجه به تعریف اصلی اشیاء ونحوه قائل شدن تفاوت بین آنها میتوان گفت پدر، مادرو هر کس که شما میتوانید ازاو چیزی رابه ارث ببریداشیاء متفاوتی هستند.آیا شما تا بحال رفتاری را از خود بروز داده اید که در مکانی دیگر همان رفتار را به شکل دیگری از خود بروز دهید.مثلا درمقابل پیغام سیلی که از شیء پدربه شما میرسد، شما مانند عمویتان زود ازکوره درمی روید و یا درشرایط یکسان نسبت به این پیغام رفتاری بنام ادب از خود بروزمیدهید،که از شیء مادر آنرا به ارث برده اید.
با توجه به مثال میتوان گفت،اشیاء مادروعمویتان نسبت به پیغام "سیلی خوردن" رفتارهای متفاوتی از خود بروز می دهند،اما صورت پیغام یکی است یعنی "سیلی خوردن".
البته این، آخر کار نیست و اگر بخواهیم میتوانیم مثال را قدری پیچیده و طبیعی تر جلوه بدهیم . باید چند شکلی قدرتمند تری را وارد کار کنیم با اعمال این پیچیدگی میتوان مثال را در مورد رفتار شما در مقابل پیغام شیء پدر به شیء شما اینچنین بیان نمود:
1)شما میتوانید در حین عصبانیت علاوه بر اینکه از کوره در می روید و رفتارهای موروثی را از خود بروز می دهید اضافه برآن عمل دیگری را نیز انجام دهید.مثلا میتوانید برخی وسایل جلوی دستتان را نیز از بین ببرید.این رفتار را شما از عمویتان به ارث نبرده اید اما رفتاری را که از عموی خود به ارث برده اید را توسعه داده اید.
2) شما میتوانید در حین عصبانیت خویشتنداری کنید ومودب بشوید.در اینصورت رفتارهای متفاوتی را که به ارث برده اید ترکیب کرده اید و نهایت چند شکلی را به نمایش گذاشته اید.
3)شما می توانید تمام رفتارهای به ارث برده شده را کنارزده ورفتاری از خود بروز دهید که تا بحال کسی ندیده است.و این اولین باری است که این رفتار را درمقابل این پیغام از خود بروز داده اید.
این حالات فقط تعدادی از حالاتی را شامل می شود که شما می توانید از خود بروز دهید در حالتی کلی میتوان اینگونه گفت که:این حالات فقط رفتارهای عمومی می باشند و در مورد انواع اشیایی از این دست متفاوت می باشد.بطورحتم حالات خاصی نیزموجودندواین حالات در تمام اشیاء ازاین نوع ٬حتی درموقعیت های از قبل تعریف نشده نیزدرذات شئ موجودند.
در برنامه نویسی مدرن امروزی که برپایه اشیاء بنا نهاده شده است تنها بخشی ازاین حالات
در چند شکلی اشیاء دنیای ماشینها موجود است.این حالات انحصارا شامل آندسته ازحالات
میشوند که دراشیاء دنیای طبیعت عمومی محسوب میشوند.حتی این حالات ،تماما در اشیاء
دنیای برنامه نویسی وجود ندارد(یعنی فقط برخی از حالات بالا).با این اوصاف حتی وجود این حالات محدود نیز انعطاف بسیار زیادی به اشیاء برای تعامل با بستر و اشیاء موجود که با آنها درارتباط هستند می بخشد.اما درصورتیکه حتی فقط تمام حالات عمومی اشیاء دنیای واقعی در اشیاء دنیای برنامه نویسی اعمال گردد ،آنگاه برنامه نویسی درسطحی فوق مدرن و طبیعی تر صورت می پذیرد و شاهد تحول عظیمی در دنیای برنامه نویسی خواهیم بود.
وجود این حالات کاملا پیشرفته به چیزی فراترو بیشتر از تحول در چند شکلی می انجامد،چرا که مثلا وجود حالت دوم مستلزم ارث بری چند گانه می باشد .در نهایت در موازات تغییر ارث بری می بایست کپسوله سازی نیز قدرتمند تر وگسترده تر از قبل پیاده سازی شود.
با این وجود و تمام کاستی های چند شکلی ،میتوان گفت :برنامه نویسی شیء گرا بدون چند شکلی به درختی فاقد هر گونه خاصیت و یا انسانی بدون روح می ماند .
وراثت باعث بوجود آمدن چند شکلی است اما بالاتراز این ،چند شکلی دلیل وجود وراثت است واین یعنی اینکه اگر بخواهیم در طبیعت بنگریم وراثت را عاملی می بینیم که فقط در سایه چند شکلی معتبر است.هرگاه شیی از دیگری ارث میبرد این چند شکلی است که بعمل توارث اعتبار می دهد وآنرا درست می نمایاند.یعنی اگردرعملیات ارث بری در حین تعامل شیء فرزند و شیء والد هیچ چیزجدید، قابل ترکیب و... بوجود نیاید آنگاه آن وراثت در آن سطح(یگانه و یا چند گانه)کاملا اشتباه می باشد.مثلا هنگامیکه دو گیاه را به منظورحاصل شدن محصول بهترباهم پیوند می زنیم (وراثت یگانه) ، انتظارداریم آندو درنتیجه محصولی فراتر از چیزیکه هر یک از آنها در خود دارند حاصل گردد.اگر هیچ عنصر جدید و قابل توجه ای بوجود نیامده باشد، آنگاه این وراثت بهیچ وجه قابل اعتنا نیست.
این مثال بوضوح نشان می دهد که حتی درسطح وراثت یگانه دلیل اصلی وراثت فقط و فقط
چند شکلی است. حال به نظر شما اگر زبانی شیء گرا وراثت چند گانه را بدون وجود چند شکلی قدرتمند تروحد اقل حضورتمامی حالات عمومی چند شکلی موثر(که در بالا تشریح شدند) پیاده سازی کند، آیا OOP یی که بنمایش می گذارد مطمئن است.
C++ با انجام این عمل و به نمایش گذاشتن کپسوله سازی نامطمئن برنامه نویسی شئ گرا را به بهانه شکستن تمام محدودیت ها در مسیری اشتباه قرار داد.جاوا به همگان ثابت کرد C++ در جهتی اشتباه پای نهاده و کاملا غیر شئ گراست.پس در چند شکلی ٬علاوه بر وراثت هم ازسوی C++ اشتباهات بزرگی انجام گرفت وباعث شد سرانجام در تازه ترین پک برنامه نویسی (ویژوال استودیو2003) به اشتباهات گذشته اعتراف کند و آنچه در گذشته بعنوان برنامه نویسی شیء گرا عرضه کرده بود را زیر پا بگذارد .به این ترتیب ارث بری چند گانه٬ ضعف چند شکلی و پلی مورفیسم ناقص از بین رفت.هر چند که این زبان بعنوان سردمدار برنامه نویسی شئ گرای مایکروسافت شناخته می شد اما با آمدن سی شارپ ،این زبان به عنوان زبان شیء گرای مایکروسافت پا به عرصه وجود گذاشت .از این مباحث حقیقتی آشکار میگردد و آن اینست که :
C++ بهیچ وجه OO نبوده و سی شارپ هیچگاه از این زبان مشتق نشد ٬ بلکه تمام بنیان وشالوده خود را در رابطه با برنامه نویسی شئ گرا از جاوا برگرفت.

پس از این مقدمه در رابطه با نحوه ارتباط پلی مورفیسم و دیگر عناصر برنامه نویسی شئ گرا نگاهی عملی به پلی مورفیسم پیچیده در سی شارپ می اندازیم.
پلی مورفیسم در رابطه با رفتارها,خواص و عناصر اصلی در برنامه نویسی شئ گرا بیشترین قدرت را در اختیار برنامه نویس میگذارد.سربارگذاری توابع و همچنین سربارگذاری عملگرها نیز جزیی و شاخه ای از پلی مورفیسم هستند, اما این پلی مورفیسم بدلیل فقدان بکارگیری تعامل با اشیاء دیگر (یعنی بدون وجود ارث بری)در رده پایینی از پلی مورفیسم قرار دارد.
در سی شارپ برای از سرگیری سلسله مراتب وراثت در رابطه با رفتارها و خواص مکانیزمی در نظر گرفته شده است که در این تاپیک تشریح میشود.
برای درک بهتر ابتدا با هم مثالی را بررسی میکنیم :



using System.Text;
namespace Inheritance
{
class Program
{
static void Main(string[] args)
{
A ab = new B(); ab.WhoAreYou();
A ac = new C(); ac.WhoAreYou();
A ad = new D(); ad.WhoAreYou();
A ae = new E(); ae.WhoAreYou();
A af = new F(); af.WhoAreYou();
B bc = new C(); bc.WhoAreYou();
B bd = new D(); bd.WhoAreYou();
B be = new E(); be.WhoAreYou();
B bf = new F(); bf.WhoAreYou();
C cd = new D(); cd.WhoAreYou();
C ce = new E(); ce.WhoAreYou();
C cf = new F(); cf.WhoAreYou();
D de = new E(); de.WhoAreYou();
D df = new F(); df.WhoAreYou();
E ef = new F(); ef.WhoAreYou();
}
}
class A
{
public virtual void WhoAreYou()
{ Console.WriteLine("I Am An A"); }
}
class B:A
{
public override void WhoAreYou()
{ Console.WriteLine("I Am A B"); }
}
class C:B
{
public new virtual void WhoAreYou()
{ Console.WriteLine("I Am A C"); }
}
class D:C
{
public override void WhoAreYou()
{ Console.WriteLine("I Am A D"); }
}
class E:D
{
public override void WhoAreYou()
{ Console.WriteLine("I Am An E"); }
}
class F:E
{
public new virtual void WhoAreYou()
{ Console.WriteLine("I Am A F"); }
}

}
حالا خروجی بصورت زیر میباشد:




I Am A B
I Am A B
I Am A B
I Am A B
I Am A B
I Am A B
I Am A B
I Am A B
I Am A B
I Am A D
I Am An E
I Am An E
I Am An E
I Am An E
I Am An E
Press any key to continue . . .



همانطور که مشاهده میکنیم این خروجی واقعا عجیب و زیباست.



من این نوع عملکرد را از سرگیری سلسه مراتب وراثت در رفتارها و خصوصیات می نامم..



با این نوع عملکرد میتوان به چندشکلی قدرتمند تری دسرسی پیدا کرد.

ghafoori
پنج شنبه 04 مرداد 1386, 21:12 عصر
دوست عزیز با تشکر از مقالتان اول متن خودتان را مستقیما داخل ورد می نویسید داخل سایت کپی نکنید تا متن تان به این صورت در نیاید بهتر اول ان را داخل نوت پد کپی کنید بعد داخل سایت کپی کنید و دوم اینکه اگر مقالتان را داخل بخش مقالات مربوط به دات نت فریم ورک بگذارید هم افراد بیشتری ان را می بینند و هم دسترسی به ان راحت تر است

Sajjad1364
شنبه 06 مرداد 1386, 22:04 عصر
با عرض پوزش از تمامی دوستان
من در حال تایپ این موضوع بودم اما داداش کوچیکم روی دکمه فرستادن کلیک کرده و من تازه الان متوجه شدم که چه خبر شده.حتما در اولین فرصت درستش می کنم :متعجب: :گیج: