PDA

View Full Version : سوال: توضیح یک قطعه کد



یوسف زالی
جمعه 08 مهر 1390, 00:12 صبح
با سلام.
دوستان کسی می تونه دقیقا بگه این قطعه کد چه می کنه؟


Instance := TComponent(InstanceClass.NewInstance); // InstanceClass is for example TForm1
TComponent(Reference) := Instance; // Reference is for example Form1
Instance.Create(Self); // Self is Application

همون طوری که حدس زدید این قطعه کد ساخت فرم دلفی هست: CreateForm
سوال اینجاست که اولا خط اول دقیقا چکار می کنه؟ منظورم NewInstance هست که در تمام اشیا وجود داره.
در ثانی انتساب خط دوم چرا TypeCast شده و چه فرقی با نکردن این کار داره؟ اصلا این نوع TypeCast که طرف اول تبدیل می شه یعنی چی؟
دست آخر هم یک شی چجوری متد خودش رو فراخوانی می کنه وقتی وجود نداره؟ اگر هم وجود داره مفهوم اون کد چیه؟

ممنون از دوستان خوبم

vcldeveloper
جمعه 08 مهر 1390, 09:06 صبح
سوال اینجاست که اولا خط اول دقیقا چکار می کنه؟ منظورم NewInstance هست که در تمام اشیا وجود داره.
حافظه مورد نیاز یک شی رو به اون اختصاص میده.


در ثانی انتساب خط دوم چرا TypeCast شده و چه فرقی با نکردن این کار داره؟ اصلا این نوع TypeCast که طرف اول تبدیل می شه یعنی چی؟
برای اینکه نوع پارامتر Reference در اون کد مشخص نیست، پس برای اینکه بشه مقدار Instance رو به اون اختصاص داد، باید Type-cast بشه.


دست آخر هم یک شی چجوری متد خودش رو فراخوانی می کنه وقتی وجود نداره؟ اگر هم وجود داره مفهوم اون کد چیه؟
شی وجود داره، چون NewInstance فراخوانی شده. اون قطعه کد هم متد Create مربوط به شی ساخته شده را فراخوانی میکنه.

ایجاد یک شی شامل دو مرحله هست؛ اول اختصاص حافظه لازم برای اون شی (NewInstance) و مقداردهی اولیه فیلدهای شی (InitInstance). دوم فراخوانی متد سازنده (constructor) اون شی. وقتی متد سازنده یک کلاس فراخوانی میشه، این عملیات به طور خودکار انجام میشه، یعنی اول NewInstance فراخوانی میشه (InitInstance از داخل NewInstance فراخوانی میشه)، و سپس constructor اجرا میشه. اما در کد TApplication.CreateForm این مراحل به صورت دستی انجام شده، یعنی برنامه نویس خودش NewInstance رو فراخوانی کرده، و سپس متد مجازی Create مربوط به TComponent رو مثل یک متد معمولی از یک شی فراخوانی کرده، تا اگر برنامه نویس اون فرم ها کدی برای مقداردهی اولیه یا تنظیم بعضی خصوصیات شی نوشته بوده، اونها هم اجرا بشند.

یوسف زالی
جمعه 08 مهر 1390, 13:48 عصر
ممنون از توضیحات خوبتون.
در مورد Type-Cast که طرف اول تبدیل می شه ممکنه کمی بیشتر توضیح بدید؟
تا به حال فکر می کردم فقط طرف دوم تساوی Cast میشه.
تفاوت این دو مورد رو اگر ممکنه بفرمایید.
ممنون

BORHAN TEC
جمعه 08 مهر 1390, 18:43 عصر
در مورد Type-Cast که طرف اول تبدیل می شه ممکنه کمی بیشتر توضیح بدید؟
خط دوم کدی که قرار دادین یعنی این که مقدار خاصیت هایی که شی Refrence از کلاس TComponent به ارث برده را با مقدار خاصیت هایی که شی Instance از کلاس TComponent به ارث برده، مقدار دهی کن. :چشمک:

یوسف زالی
جمعه 08 مهر 1390, 19:00 عصر
توجیه شدم!
ممنون از هر دو عزیز

vcldeveloper
جمعه 08 مهر 1390, 19:01 عصر
در مورد Type-Cast که طرف اول تبدیل می شه ممکنه کمی بیشتر توضیح بدید؟
تا به حال فکر می کردم فقط طرف دوم تساوی Cast میشه.
تفاوت این دو مورد رو اگر ممکنه بفرمایید.تفاوت خاصی از نظر عملکرد نمیکنند، هر دو مورد Type-cast هستند. Type-cast کردن طرف چپ یک تساوی در اکثر مواقع امکان پذیر نیست. وضعیت پارامترهای untyped فرق میکنه. این پارامترها بدون type-cast عملا کاربرد خاصی پیدا نمی کنند.



خط دوم کدی که قرار دادین یعنی این که مقدار خاصیت هایی که شی Refrence از کلاس TComponent به ارث برده را با مقدار خاصیت هایی که شی Instance از کلاس TComponent به ارث برده، مقدار دهی کن. نه، همچین چیزی نیست. Reference و Instance هر دو اشاره گر هستند. اون خط از کد میگه Reference باید به همون داده ایی که Instance داره بهش اشاره میکنه، اشاره کنه، و نوع اون داده هم باید TComponent باشه. پس چیزی از Instance به Reference یا بالعکس به اون یکی کپی نمیشه، و هیچکدوم با مقادیر خاصیت های همدیگر مقداردهی نمیشند، بلکه بعد از اجرای اون خط از کد، هر دو یک چیز هستند.

یوسف زالی
جمعه 08 مهر 1390, 19:35 عصر
ممنون از راهنمایی های دوستان.
کمی در موردش کار می کنم تا بهتر بفهمم.
ممنونم.