PDA

View Full Version : سوال: کار ;Inherited چیه؟



mbshareat
چهارشنبه 14 اسفند 1387, 18:24 عصر
اصل مطلب رو می دونم که برای وراثت از کلاس بالاتر از این دستور استفاده می شه ولی ارث بری در چه موردی؟:متعجب:
سوال دیگه من اینه که چرا گاهی اول تابع یا Procedure استفاده می شه و گاهی در در انتهایی ترین نقطه؟:گیج:

vcldeveloper
چهارشنبه 14 اسفند 1387, 23:41 عصر
کد متدی با همان نام در کلاس والد را فراخوانی میکنه.


سوال دیگه من اینه که چرا گاهی اول تابع یا Procedure استفاده می شه و گاهی در در انتهایی ترین نقطه؟
گاهی شما نیاز دارید قبل از انجام کار خودتان، کد کلاس بالاتر را اجرا کنید (مثل متد سازنده یک کلاس)، گاهی هم نیاز دارید بعد از انجام کار خودتان، کد کلاس بالاتر را اجرا کنید (مثل متد تخریب کننده یک کلاس).

AliReza Vafakhah
پنج شنبه 15 اسفند 1387, 12:31 عصر
کد متدی با همان نام در کلاس والد را فراخوانی میکنه.


آقای کشاورز میشه بیشتر توضیح بدهید

ممنون

vcldeveloper
پنج شنبه 15 اسفند 1387, 12:52 عصر
میشه بیشتر توضیح بدهید
یعنی اگر شما در داخل متد Create باشید، و کلاس والد (کلاسی که کلاس خودتان را ازش مشتق گرفتید) شما هم متد Create داشته باشه، Inherited متد Create کلاس والد را در کد Create کلاس شما فراخوانی میکنه.

AliReza Vafakhah
پنج شنبه 15 اسفند 1387, 15:48 عصر
آقای کشاورز ممنون
من دنبال این بحث در خود Help دلفی رفتم و به این ساختار برخوردم که در داخل Create از Inherited استفاده کرده ، میشه تاثیر Inherited رو در Create بگید چی هست ؟


type
TShape = class(TGraphicControl)
private
FPen: TPen;
FBrush: TBrush;
procedure PenChanged(Sender: TObject);
procedure BrushChanged(Sender: TObject);
public
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
...
end;

constructor TShape.Create(Owner: TComponent);
begin
inherited Create(Owner); // Initialize inherited parts
Width := 65; // Change inherited properties
Height := 65;
FPen := TPen.Create; // Initialize new fields
FPen.OnChange := PenChanged;
FBrush := TBrush.Create;
FBrush.OnChange := BrushChanged;
end;

vcldeveloper
پنج شنبه 15 اسفند 1387, 23:18 عصر
من دنبال این بحث در خود Help دلفی رفتم و به این ساختار برخوردم که در داخل Create از Inherited استفاده کرده ، میشه تاثیر Inherited رو در Create بگید چی هست ؟
کلاس TShape از TGraphicalControl مشتق شده. در متد Create خودش داده های خودش را مقداردهی اولیه می کند. اما کلاس والد (TGraphicalControl) هم داده های خودش را دارد، و باید آنها هم مقداردهی شوند، پس با فراخوانی inherited، کد متد Create کلاس TGraphicalControl هم اجرا می شود، پس هم داده های مخصوص به TShape مقداردهی اولیه شدند، هم داده هایی که بین TShape و کلاس والدش مشترک بودند.
اگر به کد TGraphicalControl.Create هم نگاه کنید، می بینید که در کد آن هم Inherited به کار رفته، یعنی TGraphicalControl هم داده های مخصوص خودش، و داده های مشترک با کلاس والد خودش (TControl) را مقداردهی اولیه می کند. همینطور اگر دنبال کنید، نهایتا به متد Create از کلاس TObject می رسید.

AliReza Vafakhah
شنبه 17 اسفند 1387, 10:10 صبح
آقای کشاورز ممنون من بحث قبلی رو متوجه شدم (البته با توضیحات شما)

معذرت می خواهم تابع زیر چه نیازی به Inherited; دارد ؟

خوب اگه در تابع از Inherited استفاده نشه (که من یه بار استفاه نکردم و مشکلی پیش نیامد) چی میشه ؟

این تابع ای است که بچه های فرم برای تشخیص Minimize به بنده داده اند




procedure TFrmMain.WMSysCommand(var Msg: TWMSysCommand);
begin
DefaultHandler(msg);
if (Msg.CmdType = SC_MINIMIZE) then
begin
Self.Hide;
MnuWsState.Caption:='نمایش دادن پنجره اصلی';
end;
if (Msg.CmdType = MnuAdtional.Handle) then
MnuAdtional.Click;
Inherited;
end;

vcldeveloper
شنبه 17 اسفند 1387, 11:36 صبح
خوب اگه در تابع از Inherited استفاده نشه (که من یه بار استفاه نکردم و مشکلی پیش نیامد) چی میشه ؟
علتش اینه که ممکن هست کلاس والد هم بخواد اون پیام را هندل بکنه. اگر inherited اجرا نشه، یعنی کد شما به کلاس والد فرصت هندل کردن اون پیام را نمیده.