ورود

View Full Version : در مورد متدهای Abstract



یوسف زالی
جمعه 24 آذر 1391, 21:05 عصر
قبل تر ها یادمه به این گیر می داد. اما نمی دونم کجای تنظیمات دلفی رو دست زدم که به یک وارنینگ بسنده کرده:



TC1 = class
public
procedure P1; virtual; abstract;
end;

TC2 = class(TC1)
end;

.
.

X := TC2.Create;


دوستان چیزی در این مورد می دونن؟
ممنون می شم.
دلفی 7 - وین 7

Felony
جمعه 24 آذر 1391, 21:27 عصر
اشتباه یادتونه ، دلفی برای متدهای Abstract به دادن یک Warning بسنده میکنه ، فقط وقتی از کلاسی که این متدها رو پیاده نکرده باشه سعی در صدا زدنشون بکنی در Runtime با پیغام خطا EAbstractError مواجه میشی ؛ اون Interface ها هستن که شمارو ملزم به پیاده سازی میکنن و در صورت عدم پیاده سازی کامپایل صورت نمیگیره ، این هم توضیحات اصلی :


If you create an instance of a class that has an Abstract method, then delphi warns you that it contains an uncallable method.

If you then try to call this method, Delphi will try to call AbstractErrorProc. If not found, it will throw an EAbstractError exception.

یوسف زالی
جمعه 24 آذر 1391, 23:22 عصر
ممنون. بنابراین راهی برای این نیست که زیرکلاس ها رو مجبور به بازتعریف بدنه یک متد کنیم؟ ممکنه زیرکلاس رو بدون رابط تعریف کنه.
مثلا فرم های ارث برنده وقتی بدون رابط تعریف می شن هم مجبور به بازتعریف یک متذ باشن؟

Felony
شنبه 25 آذر 1391, 08:18 صبح
گفتم که ، باید از Interface ها استفاده کنید تا کلاس های فرزند ملزم به پیروی از اون Interface طراحی شده بشن ، مثلا :


type
ITestInterface = interface
procedure TestProc;
end;

TMyClass = class(TObject, ITestInterface)

end;

کد بالا کامپایل نخواهد شد چون کلاس TMyClass متدهای تعریف شده توسط ITestInterface رو پیاده نکرده .

یوسف زالی
شنبه 25 آذر 1391, 11:54 صبح
خوب اگه یک نفر اینترفیس رو نگذاشت تو تعریف زیرکلاس (در اینجا زیر-فرم) این اجبار منتفیه.
الان شما از این کلاس زیر کلاس بگیری متدها مجبور به باز تعریف خودشون نیستند.
فکر می کنم یه راهش این باشه که تو متد constructor بیام متد ها رو با مد خاصی کال کنم. اگر ارور داد یعنی تعریف نکرده!
شاید بشه روشی پیدا کنم تا ببینم متد تعریف شذه یا نه.
اون اشتباه رو به این خاطر کردم:
Delphi cannot create instances of a class that contains abstract members.
در کل ممنون اخوی.