PDA

View Full Version : Overriding constructor



Farhad.B.S
شنبه 09 فروردین 1382, 18:07 عصر
سلام.
چطور میتونم constructor یه کلاسی رو که ساختم و از TObject مشتق شده رو override کنم ؟ من برای این کار در یونیت سیستم به عبارت constructor کلاس tobject ، دایرکتیو virtual رو اضافه کردم و یه constructor آور رید شده برای کلاس خودم نوشتم..
اما در هنگام کامپایل ، کامپایلر میگه که can not override a statick method
میخواستم بدونم علتش چیه که با وجود ایرکتیو virtual اون رو statick میبینه ؟؟؟؟ :cry: یه سوال دیگه هم داشتم ... چه طور میشه از یونیت های کامپایل شده (.dcu) در دلفی استفاده کرد ؟

ممنون.

Inprise
یک شنبه 10 فروردین 1382, 15:34 عصر
type
Tur-class = class(Tobject)
public
constructor Create(AOwner: TComponent); override;
end;

** .....

constructor Tur-class.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

*** // bagheye code ha
...
end;



به همین سادگی . :roll:

Inprise
یک شنبه 10 فروردین 1382, 15:40 عصر
در جواب سوال دومت :

یونیت مورد نظرت رو در دایرکتوری Lib دلفی کپی کن و هرجا میخای ازش استفاده کنی اسمش رو بعد بعد از Uses همون یونیت ذکر کن .

موفق باشی

Hidarneh
یک شنبه 10 فروردین 1382, 16:38 عصر
با اجازه عمو Inprise دو تا چیز هست که باید بگم.
اول اینکه فایلت باید مال همین ورژن دلفی باشه یعنی اگه با دلفی 5 کامپایل شده باشه نمی تونی توی دلفی 6 یا 7 ازش استفاده کنی و باید سورس رو داشته باشی.
دوم اینکه غیر از کپی یه را دیگه هم هست : از منوی Tools بخش Environment Options و بعد برو به صفحه Library و در قسمت Library Path مسیر فایل dcu رو وارد کن.
موفق باشی

Inprise
یک شنبه 10 فروردین 1382, 17:02 عصر
دوست عزیز

من از توابعی که در دلفی 2 نوشتم هنوز تو دلفی 7 استفاده میکنم ! این تصور که شما داری غلطه .

ممکنه نسخه های جدیدتر دلفی تفاوتهائی با نسخه های قدیمی تر داشته باشند که این مربوط به تغییر ورژن نیست بلکه مربوطه به تغییراتی است که در محیط توابع کتابخانه ای و اطلاعات آر تی ال و محل تعریف متغیرهای سراسری رخ میده . به عنوان مثال تمام تعاریف مربوطه به ورینت از دلفی 6 به بعد در یونیت جداگانه ای قرار دارند بر خلاف نسخه های قبلی که در یونیت سیستم قرار داشتند لذا اگر ماژولی داشته باشی که با دلفی 5 کامپایلش کرده باشی و ضمنا داخل از ورینت ها استفاده کرده باشی در نسخه های 6 و 7 اجرا نمیشه . نتیجتا این مساله که کامپوننتها و ماژولهای یک نسخه در نسخه های بالاتر کار نمیکنند کلیت نداره و اگر شامل تغییرات موجود در نسخه جدید نباشه بخوبی هم کار خواهند کرد .

موفق باشید .

Hidarneh
یک شنبه 10 فروردین 1382, 17:08 عصر
خوب این درسته ولی شما سورس رو داری .pas و دوباره کامپایلش می کنی نه اینکه همون فایل dcu رو بخوای استفاده کنی

Inprise
یک شنبه 10 فروردین 1382, 17:10 عصر
نخیر عزیزم . من دقیقا از Dcu ها استفاده میکنم .

Hidarneh
یک شنبه 10 فروردین 1382, 17:13 عصر
خوب چه جوری؟ تا اونجایی که من امتحان کردم ( بخصوص در مورد dpk ها) دلفی پیغام می ده و فایل pas رو می خواد.

Inprise
یک شنبه 10 فروردین 1382, 17:34 عصر
درست همونطوری که اون بالا گفتم ! :roll:

Farhad.B.S
دوشنبه 11 فروردین 1382, 14:48 عصر
با سلامی دوباره.
اینپرایز جان خوب بود اول یه امتحانی میکردی ... بازم همون ایراد رو میگیره.
اما نطر خودم اینه که چون ما برای ساختن یه شی از متد Create اون کلاس به صورت مستقیم استفاده میکنیم پس اصلا نیازی به override کردن نداریم و یه متد create جدید ایجاد میکنیم ! :wink:

Inprise
دوشنبه 11 فروردین 1382, 18:59 عصر
دوست عزیز

اگر نیازی به Override کردن کانستراکتور کلاس داشته باشید باید متد Create کلاس پدر رو حتما Override کنی . بنده سالهاست دارم اینکار رو انجام میدم . چی رو امتحان میکردم ؟؟ یقینا در کد نویسی اشتباه میکنی یا تعریف کلاست ایراد داره .

موفق باشی

amirrf
جمعه 15 فروردین 1382, 03:07 صبح
من برای این کار در یونیت سیستم به عبارت constructor کلاس tobject ، دایرکتیو virtual رو اضافه کردم و یه constructor آور رید شده برای کلاس خودم نوشتم.. اما در هنگام کامپایل ، کامپایلر میگه که can not override a statick method میخواستم بدونم علتش چیه که با وجود ایرکتیو virtual اون رو statick میبینه ؟؟؟؟
صحیح نیست در کد کلاس های قبلی دست ببرید. با این حال اگر در یکی از یونیت های VCL تغییر ایجاد کردید برای اینکه نسخه جدید کامپایل شود و مورد استفاده قرار گیرد لازم است مسیر آن را در Library Path قبل از مسیرهای حاوی نسخه کامپایل شده یونیت ها قرار دهید.
اما در مورد یونیت System تفاوتی وجود دارد؛ این یونیت بعنوان بخشی از کامپایلر قرار گرفته است و مجددا کامپایل نمی شود.


چطور میتونم constructor یه کلاسی رو که ساختم و از TObject مشتق شده رو override کنم ؟
سازنده Create در TObject مجازی تعریف نشده و بنابراین نمی توانید آن را override کنید. یک سازنده جدید در کلاس خود تعریف کنید. در TObject سازنده Create هیچ کار ویژه ای انجام نمی دهد و احتمالا به همین دلیل Static تعریف شده است، و نیازی هم نیست در سازنده خود از inherited استفاده کنید.
کدی که Inprise در بالا نوشته اشتباه است، احتمالا کلاس پایه TComponent بوده.


اما نطر خودم اینه که چون ما برای ساختن یه شی از متد Create اون کلاس به صورت مستقیم استفاده میکنیم پس اصلا نیازی به override کردن نداریم و یه متد create جدید ایجاد میکنیم
همیشه اینگونه نیست. اگر یک سازنده بصورت مجازی تعریف شده پس به رفتار چندریختی نیاز وجود داشته است و شما قاعدتا آن را override خواهید کرد.

amirrf
جمعه 15 فروردین 1382, 03:14 صبح
بدون داشتن سورس فقط با همان نسخه از کامپایلر و به شرط تغییر نکردن یونیت های مرتبط از زمان آخرین کامپایل قابل استفاده اند.