PDA

View Full Version : متدهای Virtual چه هستند؟ کاربرد آنها چیست؟ و ...



مهدی کرامتی
سه شنبه 30 تیر 1383, 13:50 عصر
با سلام.

اینم سوال دوم این بخش: متدهای Virtual چه هستند؟
کاربرد آنها چیست؟
چگونه تعریف میشوند (در کلاس پایه و وارث) ؟
چرا همه متدهای یک کلاس را بصورت Virtual تعریف نمی‌کنیم (با ذکر دلیل) ؟

neo_matrix
سه شنبه 30 تیر 1383, 15:45 عصر
از این متدها برای دوباره سازی روش ها در کلاسهای وارث استفاده می شود به این صورت که در کلاس پایه روبروی روشی که می خواهیم ان را virtual تعریف کنیم کلمه کلیدی virtual را ذکر می کنیم مانند:
;procedure test;virtual حال در کلاس وارث مانند کلاس پایه روش را تعریف می کنیم و روبروی ان کلمه کلیدی override را استفاده می کنیم.
از این روش برای این استفاده می شود که بتوان عملی را که یک روش در کلاس پایه انجام می دهد را دوباره پیاده سازی کنیم و مواردی را که کلاس وارث به انها احتیاج دارد را به روشمان اضافه کنیم .
این روش در مقابل روشهای دیگر احتیاج به حافظه بیشتری دارد ولی سرعتش نسبت به روشهای دیگر بیشتر است.
امیدوارم که درست توضیح داده باشم و اگر نه استادهای محترم راهنمایی کنند. :flower:

SReza1
پنج شنبه 01 مرداد 1383, 23:46 عصر
یکی از قابلیتهای مهم زبانهایی که oop را پشتیباتی میکنند این است که شما متدهایی بنویسیید که :
از کلاس پدر به ارث برده شوند ولی عملا پیاده سازی متفاوتی دارند.
یطور عموم تغییر رفتار متد پدر (Parent ) توسط کلاس فرزند رو با استفاده از کلمه Virtual نشون میدهند. بهر حال یکی از مزایای این سبک کدنویسی اینه که شما براحتی میتوانید کدهای مورد نظزتون رو توسعه بدهید.از طرفی شما اجازه دارید متدهای همنام با کارایی متفاوت در سیستم داشته باشید مثلا همین TWebBrowser بیش از یک متد برای navigate کردن داره!
روش تعریف : استفاده از کلمه کلیدی virtual در کلاس پدر و override در کلاس به ارث رفته(فرزند)
ارزش این کار موقعی مشخص میشه که انواعی از متدهای مشابه بتوانند توسط انواع متفاوتی از اشیائ به راههای مختلفی انجام شود.ما در طراحی سعی میکنیم که از دید object به تمام سیستم نگاه کنیم.
چرا همه متدهای یک کلاس را بصورت Virtual تعریف نمی‌کنیم (با ذکر دلیل) ؟
خوب در بسیاری از موارد شما در کلاس پدر فقط پیاده سازی نیاز دارید و نمیخواهید اجازه دهید که متدهای شما تغییر رفتار بدهند. (شاید هم نمیخواهید به developer ها اجازه دهید این کار را بکنند)
بهر حال یکی از قدرتهای تکنولوژی oop همین استفاده است که برای من استفاده از اون بسیار لذت بخش است.(دلفی ما هم از سالهای دور بر خلاف VB این روش رو پشتیبانی میکنه :) )

_alish_
دوشنبه 05 مرداد 1383, 10:46 صبح
با سلام
برای کامل تر بحث بالا با ید بگوییم تا جایی که من می دانم ما سه نوع رویه برای کلاسها می توانیم تعریف کنیم
Virtual,Dynamic,estatic

متدهای Virtual که در بالا اساتید گفتند به یک جدولی به نام VMT افزوده می شوند دارای یک شا خص پنهان هستند و به هنگام تعیین رویه ها در هنگام فراخوانی از آن شاخص استفاده می شوند (در هنگام اجرا توسط سیستم عامل تعیین می شود) متد های پویا Dynamic در یک جدول DMT افزوده می شوند حفظ و نگهداری VMT و DMT بر عهده کامپایلر می باشد
خود از نظر کاری بهطور سادهتقریبا مشابه هستند و هر دو به مفهوم این هستند که زیر کلاسی از روی آن ایجاد خواهد شد و رفتار متد تغییر خواهد کرد در هر دو شرایط در کلاس وارث برای تغییر از کلمه کلیدی Override استفاده می کنیم

ولی متد ایستا برای اینکه تغییری در آن ایجاد نشوند نوشته می شوند که نیازی به نوشتن کلمه ای جلوی متد نمی باشد (متدهای معمولی) ولی ی روش برای دوباره نویسی آن در زیر کلاسها وجود دارد نه تغییر متد بلکه دوباره نویسی و لغو متد کلاس پدر و آن کلمه کلیدی reintroduce در متد کلاس وارث می باشد

راستی فرا موش کردم فرق بین متد مجازی و پویا در این است متد های پویا برای سرعت بهینه است و متدهای پویا برای اندازه



interface
procedure setzoom; virtual;
procedure setzoom1;dynamic;
procedure setzoom2;

......
کلاس فرزند
interface
procedure setzoom; Override;
procedure setzoom1; Override;
Procedure setzoom2; reintroduce;



موفق باشید
end.

علیرضا جاوید
سه شنبه 25 اسفند 1383, 00:33 صبح
متد VIRTUAL به نوعی برای باطل کردن متد شی پدر میشه به این ترتیب که فراخوانی هایی که متدهای دیگر از آبجکت های بالاتر(پدر تر) انجام میدهند بجای اجرای متد پدری باعث اجرای متد همنام در شی فرزند مشوند. که البته اجرای متدهای باطل شده از طریق رزرو ورد Inherited امکان پذیر است.
کاربردش برای پیاده ستزی پلیمورفیزم یا چندشکلی بودن اشیا هستش.(انعطاف و عمر شی بالا میره!)
چگونگی تعریف دوستان درسته!
علت اینکه چرا همه رو ویرچوال تعریف نمیکنیم اینه که اگر چنین چیزی لازم باشه شی فرزند رو تماما طراحی میکنیم


TYPE
MyClass=class
procedure init; vituall;
.....
end;
TheClass=class(MyClass)
procedure init; vituall;
end