PDA

View Full Version : حوضه عملكرد Private و Public



shervin farzin
پنج شنبه 03 مرداد 1387, 20:14 عصر
سلام
من تا جايي كه از C و مفاهيم شي گرايي ميدونم حوضه عمل زير مجموعه هاي Private مربوط به همين كلاس و كلاسهاي دوست ميشه و public هم در همه جا قابل دسترسي .
حالا سوالم اينه كه در دلفي اگه توي يك Unit دو تا كلاس داشته باشيم مثلا يكي همون كلاس
Tform1 و يه كلاس ديگه هم خودمون درست كنيم . از داخل كلاس دوم به تمام توابع و اشياء كلاس Tform1 دسترسي دارم ، چه Public ، چه Private ، چه Protected !!!!:متفکر:
اما اگه بري توي يه يونيت ديگه فقط ميتوني به اشياء زير مجموعه Public دسترسي داشته باشي و مطلبي كه نميفهمم اينه كه من سطح Private رو براي كلاسم تعريف كردم نه براي كل Unit

ممكنه يكي از دوستانم به من بگه ، چطوريه كه ايتوريه ! ممنون

Hsimple11
پنج شنبه 03 مرداد 1387, 20:35 عصر
- یک عضو کلاس که در بخش Private تعریف شود فقط در همان کلاس و متدهای آن قابل دسترسی است.

- یک عضو کلاس که در بخش Protected تعریف شود فقط در همان کلاس و کلاسهایی که از آن کلاس به ارث ببرند قابل دسترسی است.

-یک عضو کلاس که در بخش Public تعریف شود هم در این کلاس و یونیت و هم در یونیت دیگری که از این یونیت استفاده کند قابل دسترسی است.


اما اگه بري توي يه يونيت ديگه فقط ميتوني به اشياء زير مجموعه Public دسترسي داشته باشي
فکر میکنم جمله آخر جواب سوالتان را داده باشد.

shervin farzin
پنج شنبه 03 مرداد 1387, 20:50 عصر
سلام دوست من .
با عرض شرمندگي بايد عرض كنم من اينو كه شما فرموديد ميدونستم . شايد خوب سوالم رو نپرسيدم .
سوالم اينه كه من مثلا يه تابع رو در بخش Private از كلاس Test مينويسم . بخش Private تعريف شده براي كلاس Test، نه براي كل Unit .
اگه فقط يه بخش Private ميشد براي هر Unit تعريف كرد ، خوب فرمايش شما صحيح بود ، ولي نكته اينجاست كه ما ميتونيم براي هر كلاس زير مجموعه Unit يه Private داشته باشيم و من انتظار داشتم اين بخش ها فقط در حوضه كلاسهاي مربوط به خودشون عمل كنن ولي ميبينم كه انگار تمامشون مربوط به Unit ميشن تا كلاس خودشون .
اميدوارم درست منظورمو رسونده باشم . ممنون

Hsimple11
پنج شنبه 03 مرداد 1387, 21:39 عصر
بخش Private تعريف شده براي كلاس Test، نه براي كل Unit ا

"برای کل یونیت" منظورتون کلاس TForm است ؟

مطمئنید کلاس خود را درست تعریف می کنید؟ کد خود را اینجا قرار دهید.

اگر متغیر یا متدی را در بخش Private مربوط به همان کلاس تعریف کنید فقط در حوزه همان کلاس قابل دسترسی است. در ضمن به مسئله Inheritance توجه کنید. زمانی که یک کلاس را می سازید اگر در همان زمان مشخص کنید که این کلاس از چه کلاسی به ارث می برد مثلا :


Type
TMyClass = Class of TControl;

در این صورت تمامی اعضای کلاس TControl (و حتی کلاسهایی که TControl از آن به ارث می برد)در کلاس TMyClass قابل دسترسی هستند.

B-Vedadian
پنج شنبه 03 مرداد 1387, 22:46 عصر
اگر متغیر یا متدی را در بخش Private مربوط به همان کلاس تعریف کنید فقط در حوضه همان کلاس قابل دسترسی است. در ضمن به مسئله Inheritance توجه کنید.

خير. تو دلفي، اين مفاهيم با c فرق ميکنه. تمام تعريف‏هايي که گفتيد درسته بجز يک نکته، تو يک unit هيچ بخشي از يک کلاس از کلاس ديگه پنهان نيست.

تعاريف بالا در مورد unitهاي مختلف صدق ميکنه. ا.ي.

private فقط براي خود کلاس، اگه کلاسي که باهاش کار ميکنه تو unit ديگه باشه.
protected فقط براي خود کلاس و کلاس‏هايي که ازش ارث ببرن، اگه ...
public در همه جا قابل رؤيته.
published تو ليست مشخصات شئ(اگه کامپوننت vcl باشه، قرار ميگيره - تو property editor).

shervin farzin
پنج شنبه 03 مرداد 1387, 22:56 عصر
آقا بسيار عالي .
من كلاسم رو اين طوري تعريف كردم .
Type
my_class = class (Tform)
و در ضمن به مسئله ارث بري هم دقت كردم .
اما اگه توي يك يونيت تمام بخشهاي يك كلاس قابل روئيت باشه ، ديگه مشكل من حل شده .
از هر دوي شما دوستان ممنونم .

Hsimple11
جمعه 04 مرداد 1387, 00:29 صبح
تمام تعريف‏هايي که گفتيد درسته بجز يک نکته، تو يک unit هيچ بخشي از يک کلاس از کلاس ديگه پنهان نيست.

ممنونم.

و یک نکته مهم :

دوست shervin farzin من هم مانند شما اشتباه کردم. حوزه به معنای محدوده و ناحیه این املا را دارد!. موفق باشید...