View Full Version : اندر احوالات Virtual و Override
Developer Programmer
پنج شنبه 07 اردیبهشت 1385, 19:49 عصر
واسه اینکه متدهای Virtual, Override رو بهتر یادبگیرم 3 تا unit ساختم و در هر کدوم یه class نوشتم که یکی از دیگری ارث بری کنه
TCustomButton = Class( TButton )
public
constructor Create(AOwner: TComponent); virtual;
چون متد Create رو Virtual تعریف کردم، پس کلاس های فرزند می توانند برای خودشون متد دیگری رو بسازن
TChildCustomButton = Class( TCustomButton ) // TChildCustomButton is child of TcustomButton
public
constructor Create(AOwner: TComponent); override;
end;
چون متد create رو override کردم پس به این معنیه که دارم یه متد از Parent رو refine میکنم
اما...
TChildOfChildCustomButton = Class(TChildCustomButton)
public
constructor Create(AOwner: TComponent);
چرا با وجود اینکه TChildCustomButton.Create رو virtual نکردم،هنوزم میتونم TChildOfChildCustomButton.Create رو تعریف کنم ؟ چی کار کنم که Static بشه ؟
vcldeveloper
جمعه 08 اردیبهشت 1385, 06:53 صبح
چرا با وجود اینکه TChildCustomButton.Create رو virtual نکردم،هنوزم میتونم TChildOfChildCustomButton.Create رو تعریف کنم ؟ چی کار کنم که Static بشه ؟
در صورت Override نکردن Create در کلاس فرزند و تعریف او بصورت Static (همون کاری که در کد سوم انجام دادید)، متد Create کلاس والد Hide میشه، یعنی نمی تونید اونو از طریق کلاس فرزند فراخوانی کنید.
object
جمعه 08 اردیبهشت 1385, 10:27 صبح
اگر عبارت Inherited رو قرار ندی و کامنتش کنی به ماقبلش برنمیگرده اصلا
Developer Programmer
جمعه 08 اردیبهشت 1385, 18:03 عصر
علی جان ، دورت بگردم که اینقدر خوبی !
آخه Mastering Delphi7 میگه هروقت خواستی Redefined کنی ، باید Override رو بنویسی ...
vcldeveloper
شنبه 09 اردیبهشت 1385, 05:54 صبح
آخه Mastering Delphi7 میگه هروقت خواستی Redefined کنی ، باید Override رو بنویسی ...
درسته، وقتی از Override استفاده میکنی یعنی می تونی متد موجود در کلاس والد را هم اجرا کنی - با اجرای Inherited در واقع کد کلاس مادر فراخوانی میشه. مثلا فرض کن کلاس والد یکسری چیزها را در متد Create خودش مقدار دهی اولیه میکنه، تو یه کلاس فرزند میسازی و یکسری چیز جدید بهش اضافه میکنی. در متد Create خودت مقادیر جدید را مقداردهی اولیه میکنی و برای مابقی مقادیر که از قبل در کلاس والد وجود داشتند از Inherited استفاده میکنی. حالا اگر بخوای کلا متد Create کلاس والد را باطل کنی و تمامی عملیات مقداردهی اولیه را خودت در کلاس فرزند انجام بدی، اون وقت می تونی Override را برداری. معمولا کمتر حالتی پیش میاد که کسی بخواد یک متد Virtual را در کلاس فرزند بصورت Static دوباره تعریف کنه. خود دلفی هم اخطاری میده که متد Static شما داره یه متد Virtual در کلاس مادر را Hide میکنه.
بصورت کلی تعریف دوباره یک متد Virtual در یک کلاس فرزند بصورت Static توصیه نمیشه، ولی شما پرسیدی که چرا در حالی که متد Create در کد سوم Override نداره، هنوز اجرا میشه...جوابش هم اینه که چون با برداشتن کلمه Override متد Create کد سوم متد کلاس مادر را که Virtual بود Hide میکنه و دیگه امکان استفاده از Create کلاس مادر نیست.
SH.Daneshvar
شنبه 09 اردیبهشت 1385, 15:45 عصر
دوست عزیز اگر میخواهی متدی که در کلاس های بالاتر به صورت Virtual و یا Dynamic تعریف
شده است رو نذاری در کلاس های بعدی Override بشن باید اون رو بصورت final تعریف کنی.
constructor Create(AOwner: TComponent); override; final;
Developer Programmer
شنبه 09 اردیبهشت 1385, 21:15 عصر
کم کم داره یه چیزهایی می افته !
پس هر وقت که خواستیم متد Virtual والد رو Redefine کنیم باید در کلاس فرزند Override را بذاریم . اینطوری می تونیم با Inherited کردن در فرزند، علاوه بر کارهایی که والد انجام میده چند تا کار دیگه هم در فرزند اضافه کنیم.
و اگه نخواستیم از کدهای نوشته شده والد استفاده کنیم و خواستیم که همه چیز رو از اول خودمون بنویسیم، نباید override رو بذاریم.
اما اگه متدی رو با override کردن Redefine کنیم، و ضمنا نخواهیم که فرزند دیگه ای این متد Redefine شده رو دوباره Redefine کنه ، چی ؟
constructor Create(AOwner: TComponent); override; final;
خطا می گیره ...
SH.Daneshvar
یک شنبه 10 اردیبهشت 1385, 08:24 صبح
من روی Delphi 2006 for Win32 تست کردم.
فکر کنم این Final یه چیز جدید. من این رو از Java یا گرفتم.
فکر کنم Final به Delphi 2006 اضافه شده باشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.