View Full Version : مشکل با دستور inherited کمک کنید
Mbr
شنبه 26 دی 1383, 07:51 صبح
با سلام
می خواستم بدونم دو دستور زیر در دلفی دقیقا چه کاری انجام می دهند .
inherited Create(...);
inherited;
با تشکر از دوستان
hps
شنبه 26 دی 1383, 11:36 صبح
1. وقتى که یه کلاس فرزند (Child) موقع Override کردن یکى از Methodهاى Virtual کلاس والد (Parent) مىخواد تا عین همون Method رو از والدش فراخوانى کنه از دستور inherited استفاده مىکنه. مثلا مىخواى توى Create اول کارهایى رو که والد براى Create شدن انجام مىده رو انجام بدى بعد یه چیزایى رو به اون اضافه کنى. مىنویسى :
inherited Create({Parameter List);
{Do something ...}
اگه inherited رو صدا نکنى Method والد صدا نمىشه. در ضمن فقط براى Create استفاده نمىشه مثال زیر رو ببین:
type
TParent = class
public
function Foo(Bar: Integer): Integer; virtual;
end;
TChild = class (TParent)
public
function Foo(Bar: Integer): Integer; override;
end;
function TParent.Foo(Bar: Integer): Integer;
begin
Result := Bar * 2;
end;
function TChild.Foo(Bar: Integer): Integer;
begin
Result := inherited Foo(Bar); // returns Bar * 2
Result := Result * 3;
end;
اگه به Foo یه Object از نوع TParent مثلا 2 رو بدى بهت 4 رو بر مىگردونه و اگه این Object از نوع TChild باشه همون 2 رو بدى بهت 6 برمىگردونه.
2. دو خط دستور هیچ فرقى با هم ندارن یعنى هر کدوم رو صدا بزنى این اتفاق مىافته چه inherited چه inherited ... رو. توى پاسکال و Versionهاى قدیمىتر (Compilerهاى قبل از 3) باید از دومى استفاده کنى.
Mbr
شنبه 26 دی 1383, 12:05 عصر
با تشکر از شما دوست عزیز
Mbr
شنبه 26 دی 1383, 12:14 عصر
با تشکر از دوست عزیز
می خوام بدونم اگر در یک برنامه در قسمت onclick یک دکمه فقط کلمه Inherited; نوشته شده باشد چگونه می توان فهمید کدوم والد و از کجا صدا زده می شود . و چگونه می توان در برنامه این را پیدا کرد .
برای مثال
constructor TADOConnection.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FConnectionObject := CreateADOObject(CLASS_Connection) as _Connection;
OleCheck(ConnectionPoint.Advise(Self as IUnknown, FConnEventsID));
FCommands := TList.Create;
LoginPrompt := True;
FIsolationLevel := ilCursorStability;
CursorLocation := clUseClient;
FKeepConnection := True;
end;
Mbr
شنبه 26 دی 1383, 12:15 عصر
constructor TADOConnection.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FConnectionObject := CreateADOObject(CLASS_Connection) as _Connection;
OleCheck(ConnectionPoint.Advise(Self as IUnknown, FConnEventsID));
FCommands := TList.Create;
LoginPrompt := True;
FIsolationLevel := ilCursorStability;
CursorLocation := clUseClient;
FKeepConnection := True;
end;
hr110
شنبه 26 دی 1383, 13:01 عصر
شما وقتی INHERTITED را صدا میکنید ، اولین والدی که متد را پیاده سازی کرده است صدا خواهد شد.
Mbr
شنبه 26 دی 1383, 13:50 عصر
با تشکر از مدیر بخش
اگر با توجه به حرفی که شما زده اید باشد از کجا می توان فهمید اولین والدی که متد را پیاده سازی کرده است چیست که آن را صدا زده است .
مثلا در یک برنامه در ONCLICK تمام منوها این خط نوشته شده است چگونه می توان آن را فهمید :
procedure TfrmMainFormCom.miNationComClick(Sender: TObject);
begin
inherited;
end;
و آیا مقاله ای در زمینه وراثت و مبحث والد و روابط پدر و فرزند وجود دارد اگر وجود دارد آیا لینکی برای آن وجود دارد .
hr110
یک شنبه 27 دی 1383, 06:57 صبح
سلام،
ممکن است من سوال شما را به درستی متوجه نشده باشم، ولی فراخوانی متدهای بالاتر(پدر) به شکل بازگشتی میباشد.یعنی در خطی که شما عبارت inherited را صدا کرده باشید، کنترل برنامه به متد بالاتر ارجاع داده میشود و در صورتی که کلاس پدر انرا پیاده سازی نکرده باشد به متد پدر بزرگ( :wink: ) و اگر انهم پیاده سازی نکرده باشد به متد پدر پدر بزرگ و ... ارجاع داده خواهد شد. حال شما در هنگام پیاده سازی کلاسهای خود در گیر این مسائل نخواهید بود و اگر این کلاسها را براساس یک اصول منتطق و استاندارد پیاده سازی کرده باشید مشکل خاصی نخواهید داشت.
در مورد مقاله هم شرمنده :oops:
Mbr
یک شنبه 27 دی 1383, 08:13 صبح
با تشکر از مدیریت بخش
و خسته نباشید
منظور من دقیقا همان چیزی بود که شما پاسخ آن را دادید حال می خواستم بدانم این متدهای پدر و پدر بزرگ و غیره در کجای برنامه و با چه مشخصاتی تعریف شده اند . مثلا توابع را در قسمت خاصی می توانیم تعریف کنیم آیا این متدهای پدر و پدربزرگ در قسمتهای خاصی از برنامه و با مشخصات خاصی نوشته شده اند . ببخشید این سوال را کرده ام شاید خنده دار باشد ولی من درباره رابطه وراثت در دلفی هیچ اطلاعاتی ندارم .
Inprise
یک شنبه 27 دی 1383, 11:06 صبح
منظور من دقیقا همان چیزی بود که شما پاسخ آن را دادید حال می خواستم بدانم این متدهای پدر و پدر بزرگ و غیره در کجای برنامه و با چه مشخصاتی تعریف شده اند . مثلا توابع را در قسمت خاصی می توانیم تعریف کنیم آیا این متدهای پدر و پدربزرگ در قسمتهای خاصی از برنامه و با مشخصات خاصی نوشته شده اند . ببخشید این سوال را کرده ام شاید خنده دار باشد ولی من درباره رابطه وراثت در دلفی هیچ اطلاعاتی ندارم
اینجا ، مسئله متد نیست . مسئله کلاس است . اگر به جواب اول همین تاپیک دقت کنی ، اگر میخای جزئیات پیاده سازی چنین متدی رو ببینی باید به کلاس یا کلاسهای والد مراجعه کنی . برای این مقصود به محل تعریف کلاست مراجعه کن و ببین از کدوم کلاس مشتق شده . یک چیزی مثل همین :
TChild = class (TParent)
اگر میخای حجم قابل توجهی از کد رو بررسی کنی به زعم حقیر Code Explorer حضرت ModelMaker میتونه کمک های مفید و مؤثری بهت بکنه .
http://www.modelmakertools.com/pics/code-explorer/mmx-overview.png
هر چند میتونی با ابزارهای داخلی محیط دلفی و مطالعه متن کد هم به مقصودت برسی .
آیا مقاله ای در زمینه وراثت و مبحث والد و روابط پدر و فرزند وجود دارد اگر وجود دارد آیا لینکی برای آن وجود دارد
عده ای از صاحبنظران بر این باورند که وجود داشتن یک مقاله AND وجود نداشتن لینکی به اون مقاله ، محل اشکال است . فلذا اظهر آن است که اگر و فقط اگر لینکی وجود داره ، تصور کنیم مقاله ای وجود داره :evil2:
برای اینکه بسیاری از ابهاماتت بر طرف بشه ؛ مطالعهء فصل دوم کتاب گرانقدر Delphi in a Nutshell (http://www.oreilly.com/catalog/delphi/chapter/ch02.html) رو بهت توصیه میکنم . اگر فاز نداد بگو لینک مقاله بهت بدیم .
موفق باشید
Mbr
یک شنبه 27 دی 1383, 16:14 عصر
با تشکر از شما دوست عزیز
من به لینکی که گفته بودید یه سری زدم خوب بود ولی اگر مقاله ای به زبان فارسی دارید برام لینک کنید ممنون می شوم چون زبان انگلیسیم زیاد خوب نیست . با تشکر
Mbr
دوشنبه 28 دی 1383, 07:45 صبح
با سلام
از دوستان عزیزی که جواب داده اند تشکر می کنم
و سوال خودم را به این صورت تغییر می دهم که برنامه نویسی بصورت تکنولوژی وراثت یا همان رابطه پدر و فرزندی در دلفی چیست چه کاربردی دارد و چه مزیت هایی نسبت به برنامه نویسی معمولی دارد .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.