PDA

View Full Version : تفاوت دو قسمت interface و public برای تعریف متغیرها ؟



مهران رسا
پنج شنبه 26 فروردین 1389, 20:55 عصر
سلام.


چه تفاوتی بین تعریف متغیر در قسمت interface (بعد از uses) و تعریف متغیر در قسمت public وجود داره ؟ در حالیکه اگر متغیر در هر یک از این دو قسمت تعریف بشه در تمامی Unit ها قابل دسترس هست.

Mahmood_M
پنج شنبه 26 فروردین 1389, 21:31 عصر
Public قسمتیه که خصوصیات عمومی یک کلاس ( یا شی ) درون اون قرار می گیره ، عبارت Public ای که درون Unit قرار داره ، مربوط به کلاس TForm هست که همون شی فرم برنامه محسوب میشه ، وقتی متغیری در قسمت Public یک کلاس تعریف میشه یک عنصر از اون کلاس محصوب میشه و با توجه به اینکه از نوع Public هست سایر اشیاء هم می تونن از طریق کلاس صاحب اون ( یعنی Form1 یا ... ) به اون متغیر یا خصوصیت یا ... دسترسی داشته باشن ...
اما متغیری که در قسمت Var اصلی Unit تعریف میشه یک متغیر عمومی هست بدون اینکه مالکی داشته باشه ! ، یعنی هیچ کلاسی یا شئ ای مالک اون نیست ، در اینصورت هر Unit ای که Unit مربوط به اون متغیر رو Use کنه می تونه به اون متغیر دسترسی داشته باشه ...

Public وظیفه ی اصلیش نگهداری متغیرهای تعریف شده نیست بلکه یکی از ویژگیهای کلاسهای تعریف شده در دلفی هست که می تونه خصوصیات عمومی کلاس رو در خودش نگهداری کنه حالا چه متغیر باشه ، چه تابع و چه Procedure و ... ، اما قسمت Var اصلی Unit صرفا برای تعریف متغیرهای عمومی ای که به مالک نیاز ندارن استفاده میشه ...

به عنوان یک نتیجه گیری ، قسمت Public و Var اصلی Unit تقریبا میشه گفت قابل مقایسه نیستن و هرکدوم وظایف خاص خودشون رو دارند ، Public زیرمجموعه ای از یک کلاس هست و قسمت Var در بخش Interface امکانی است برای تعریف متغیرهای عمومی برنامه که نیاز به مالک ! ندارند ...

موفق باشید ...

vcldeveloper
پنج شنبه 26 فروردین 1389, 23:32 عصر
دلفی یک زبان Hybrid هست، یعنی مثل ++C هم از برنامه نویسی شی گرا پشتیبانی میکنه، هم از برنامه نویسی Structural غیر شی گرا.

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

پس تفاوت شان در شی گرایی هست. البته از نظر تخصیص حافظه هم با هم فرق می کنند. یک متغیر Global از زمان اجرای برنامه در Stack مقداردهی میشه و فضایی از حافظه را به خودش اختصاص میده، در حالی که یک فیلد تعریف شده در یک کلاس تا زمانی که نمونه شی ایی از اون کلاس ساخته نشده باشه، ایجاد و مقداردهی نمیشه. وقتی هم که شی ایی ایجاد بشه، اون فیلد روی حافظه Heap مقداردهی میشه. البته یک استثناء وجود داره، اون هم class varها یا متغیرهای کلاس (یا فیلدهای Static) هستند، که اونها نمونه ایی از متغیرهای Global در فضای برنامه نویسی شی گرا هستند؛ یعنی متغیرهایی که به یک کلاس خاص تعلق دارند، نه به نمونه اشیاء ساخته شده از آن کلاس. به همین دلیل هم برای استفاده از آنها نیازی به ساختن شی از اون کلاس نیست.

از نظر Syntax هم این تفاوت را با هم دارند که میشه به یک متغیر Global از طریق UnitName.VariableName یا فقط VariableName دسترسی پیدا کرد، یعنی نام یونیت + نام متغیر، یا فقط نام متغیر. اما برای متغیرهای کلاس یا فیلدهای کلاس حتما باید نام کلاس یا نام شی مربوطه هم قید بشه.