PDA

View Full Version : Class Helper در دلفی



مصطفی ساتکی
دوشنبه 24 خرداد 1389, 00:27 صبح
Class Helper ها در واقع راهی جهت توسعه کلاس ها بدون استفاده از وراثت.
در واقع Class Helper به شما اجازه می دن که کده خودتونو به کلاس هایی اضافه کنید که سورسشنو ندارید.
Class Helper ها فقط به بخش pubic کلاس موردنظر دسترسی دارن و بخش private و protected کلاسی که بهش کمک میشه قابل دسترس نیستند.
البته نا گفته نمونه که پشت صحنه این داستان مثل عملکرد فراخوانی یک تابع از کلاس میمونه.
وقتیکه property یا متدی در کلاس helper تعریف میشه از اون میشه در کلاسی که بهش کمک شده و کلاس هایی که از این کلاس به ارث بردن استفاده کرد.
قابل ذکر که به این نکته هم اشاره بشه زمانیکه سورس وجود داره استفاده از Class Helper نمی تونه زیاد جالب باشه یعنی یه جورایی داریم خدمونو گول میزنیم .
حتی الامکان سعی کنید که بیش از یک Class Helper برای یک Class تعریف نکنید .البته شما آزادید که هر چند تا تعریف کنید ولی توصیه نمیشه.قضیش مثل فرزند کمتر زنگیه بهتره کلاً بگم اگر وراثت بهتر جواب میده Class Helper رو بیخیال شید.
Class helper ها این قابلیتو ندارند که به طور مستقیم آبکجت توش Create کنید و همچنین Self هم اشاره داره به کلاسی که به اون کمک شده.
اگر Class Helper ها به گونه ای بود که مختص به یک Object نمی شد اون وقت میشد وراثت چندگانه که بسیار مفید بود راحت میتونستیم مستقیم از کلاس مورد نظر استفاده می کردیم اما در وضعیت جاری مجبوریم یه Member از نوع اون کلاس تعریف کنیم اونو Create کنیم و سپس از اون استفاده کنیم و در نهایت هم free ش کنیم.
به Class Helper ها می توان Property اضافه نمود ولی Member Field نمی تونیم برای property مون تعریف کنیم بلکه بایستی از Member Field های موجود استفاده کنیم.
در زیر تابعی به کلاس TCanvas اضافه کردیم جهت رسم توابع هندسی
TCanvasHelper = class helper for TCanvas
private
public
procedure DrawFunc(X1,X2 : Integer;AFunc : TFunc<Integer,Integer>);
end;

SAASTN
دوشنبه 24 خرداد 1389, 00:34 صبح
در واقع Class Helper به شما اجازه می دن که کده خودتونو به کلاس هایی اضافه کنید که سورسشنو ندارید.
این دقیقا یعنی چی؟ مثل کامپوننت هایی که فقط dcu ها همراهشونه؟ خود این Class Helper ها رو می شه register کرد؟

مصطفی ساتکی
دوشنبه 24 خرداد 1389, 01:05 صبح
خود این Class Helper ها رو می شه register کرد
Class Helper یک نوع type هستند که به کلاس کمک گیرنده متصل می شوند در نتیجه قابلیت register ندارند در ضمن محدوده استفاده آنها محدوده نزدیک unit که آن را پیاده کرده می باشد