با سلام
می خواستم بدونم دو دستور زیر در دلفی دقیقا چه کاری انجام می دهند .
inherited Create(...);
inherited;
با تشکر از دوستان
با سلام
می خواستم بدونم دو دستور زیر در دلفی دقیقا چه کاری انجام می دهند .
inherited Create(...);
inherited;
با تشکر از دوستان
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) باید از دومى استفاده کنى.
با تشکر از شما دوست عزیز
با تشکر از دوست عزیز
می خوام بدونم اگر در یک برنامه در قسمت 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;
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;
شما وقتی INHERTITED را صدا میکنید ، اولین والدی که متد را پیاده سازی کرده است صدا خواهد شد.
... چه بگویم که غم از دل برود چون تو بیایی
با تشکر از مدیر بخش
اگر با توجه به حرفی که شما زده اید باشد از کجا می توان فهمید اولین والدی که متد را پیاده سازی کرده است چیست که آن را صدا زده است .
مثلا در یک برنامه در ONCLICK تمام منوها این خط نوشته شده است چگونه می توان آن را فهمید :
procedure TfrmMainFormCom.miNationComClick(Sender: TObject);
begin
inherited;
end;
و آیا مقاله ای در زمینه وراثت و مبحث والد و روابط پدر و فرزند وجود دارد اگر وجود دارد آیا لینکی برای آن وجود دارد .
سلام،
ممکن است من سوال شما را به درستی متوجه نشده باشم، ولی فراخوانی متدهای بالاتر(پدر) به شکل بازگشتی میباشد.یعنی در خطی که شما عبارت inherited را صدا کرده باشید، کنترل برنامه به متد بالاتر ارجاع داده میشود و در صورتی که کلاس پدر انرا پیاده سازی نکرده باشد به متد پدر بزرگ( :wink: ) و اگر انهم پیاده سازی نکرده باشد به متد پدر پدر بزرگ و ... ارجاع داده خواهد شد. حال شما در هنگام پیاده سازی کلاسهای خود در گیر این مسائل نخواهید بود و اگر این کلاسها را براساس یک اصول منتطق و استاندارد پیاده سازی کرده باشید مشکل خاصی نخواهید داشت.
در مورد مقاله هم شرمنده :oops:
... چه بگویم که غم از دل برود چون تو بیایی
با تشکر از مدیریت بخش
و خسته نباشید
منظور من دقیقا همان چیزی بود که شما پاسخ آن را دادید حال می خواستم بدانم این متدهای پدر و پدر بزرگ و غیره در کجای برنامه و با چه مشخصاتی تعریف شده اند . مثلا توابع را در قسمت خاصی می توانیم تعریف کنیم آیا این متدهای پدر و پدربزرگ در قسمتهای خاصی از برنامه و با مشخصات خاصی نوشته شده اند . ببخشید این سوال را کرده ام شاید خنده دار باشد ولی من درباره رابطه وراثت در دلفی هیچ اطلاعاتی ندارم .
اینجا ، مسئله متد نیست . مسئله کلاس است . اگر به جواب اول همین تاپیک دقت کنی ، اگر میخای جزئیات پیاده سازی چنین متدی رو ببینی باید به کلاس یا کلاسهای والد مراجعه کنی . برای این مقصود به محل تعریف کلاست مراجعه کن و ببین از کدوم کلاس مشتق شده . یک چیزی مثل همین :منظور من دقیقا همان چیزی بود که شما پاسخ آن را دادید حال می خواستم بدانم این متدهای پدر و پدر بزرگ و غیره در کجای برنامه و با چه مشخصاتی تعریف شده اند . مثلا توابع را در قسمت خاصی می توانیم تعریف کنیم آیا این متدهای پدر و پدربزرگ در قسمتهای خاصی از برنامه و با مشخصات خاصی نوشته شده اند . ببخشید این سوال را کرده ام شاید خنده دار باشد ولی من درباره رابطه وراثت در دلفی هیچ اطلاعاتی ندارم
TChild = class (TParent)
اگر میخای حجم قابل توجهی از کد رو بررسی کنی به زعم حقیر Code Explorer حضرت ModelMaker میتونه کمک های مفید و مؤثری بهت بکنه .
هر چند میتونی با ابزارهای داخلی محیط دلفی و مطالعه متن کد هم به مقصودت برسی .
عده ای از صاحبنظران بر این باورند که وجود داشتن یک مقاله AND وجود نداشتن لینکی به اون مقاله ، محل اشکال است . فلذا اظهر آن است که اگر و فقط اگر لینکی وجود داره ، تصور کنیم مقاله ای وجود داره :evil2:آیا مقاله ای در زمینه وراثت و مبحث والد و روابط پدر و فرزند وجود دارد اگر وجود دارد آیا لینکی برای آن وجود دارد
برای اینکه بسیاری از ابهاماتت بر طرف بشه ؛ مطالعهء فصل دوم کتاب گرانقدر Delphi in a Nutshell رو بهت توصیه میکنم . اگر فاز نداد بگو لینک مقاله بهت بدیم .
موفق باشید
UNIX is simple. It just takes a genius to understand its simplicity
-- Dennis Ritchie
با تشکر از شما دوست عزیز
من به لینکی که گفته بودید یه سری زدم خوب بود ولی اگر مقاله ای به زبان فارسی دارید برام لینک کنید ممنون می شوم چون زبان انگلیسیم زیاد خوب نیست . با تشکر
با سلام
از دوستان عزیزی که جواب داده اند تشکر می کنم
و سوال خودم را به این صورت تغییر می دهم که برنامه نویسی بصورت تکنولوژی وراثت یا همان رابطه پدر و فرزندی در دلفی چیست چه کاربردی دارد و چه مزیت هایی نسبت به برنامه نویسی معمولی دارد .