PDA

View Full Version : Constructor



Kamyar.Kimiyabeigi
شنبه 12 اسفند 1385, 08:56 صبح
Constructor

برای تخصیص حافظه به اشیاء، متد Create را فراخونی می‌کنیم. این متد، یک Constructor هست. Constructor، یک متد خاص از کلاس هست که ‌می‌توانید از این متد در تخصیص حافظه برای یک نمونه از یک کلاس استفاده کنید. نمونه‌ی ساخته شده، توسط متد Constructor برگردانده می‌شود و به متغیری برای ذخیره‌سازی و استفاده در آینده تخصیص داده می‌شود. منظور از "آینده"، بلافاصله بعد از ساختن نمونه/شیئ هست. همه اطلاعات یک نمونه‌ی جدید با صفر مقدار‌دهی شده ست و دلیل آن هم شکل خاص متد Constructor هست، به این معنی که متد Constructor، پارامتر خاصی برای ارسال ندارد تا بتوان از این پارامتر در مقداردهی اولیه استفاده کرد. اگر می‌خواهید نمونه‌ی ایجاد شده، شامل مقادیر خاصی باشد به این معنی که در شروع کار، نمونه/شیئ ساخته شده، شامل اطلاعاتی باشد، می‌بایست یک Constructor سفارشی بنویسید.

از کلمه کلیدی Constructor در ابتدای متد constructor استفاده کنید. با اینکه می‌توانید هر نامی را برای constructor انتخاب کنید، اما بهتر ست که از نام استاندارد، یعنی Create استفاده کنید. اگر از نام دیگری به غیر از Create استفاده کنید، متد Create از کلاس پایه که TObject هست هنوز هم فعال هست و می‌توان از آن استفاده کرد و برنامه‌نویس هم، Constructor پیش‌فرض کلاس را با پارمتر‌های مربوطه فرخوانی می‌کند، چونکه نام Constructor سفارشی را نمی‌شناسد. همین می‌تواند دلیلی باشد برای پیروی از نام‌گذاری استانداردِ یک Constructor.

برای تعریف یک Constructor با چند پارامتر، تعریف پیش‌فرض Constructor را با تعریف جدید جایگزین می‌کنید و از این پس مجبور به استفاده از آن می‌باشید.

برای مثال، بعد از تعریف :


type
TDate = class
public
constructor Create (y, m, d: Integer);


شما فقط می‌توانید این Constructor را فراخوانی کنید و نه متد Create استاندارد را:


var
ADay: TDate;
begin
// Error, does not compile:
ADay := TDate.Create;
// OK:
ADay := TDate.Create (1, 1, 2000);


در این مثال، استفاده از متد Create استاندارد باعث بروز خطا می‌شود.

قوانین موجود برای نوشتن Constructorها برای کامپوننت‌های سفارشی متفاوتند. به دلیلی در مثال بالا می‌بایست یک virtual constructor را override کنید. از کلمه‌کلیدی overload نیز می‌توانید استفاده کنید تا چند constructor برای یک کلاس داشته باشید و همگی را نیز Create بنامید. توسط این روش(استفاده از Overload) هم از قاعده استاندارد نام‌گذاری که در تمام زبان‌های شیئ‌محور رعایت می‌شود، تبعیت کرده‌اید و هم یادآوری نام Create برای برنامه‌نویس ساده خواهد بود. برای مثال: می‌خواهم دو متد Create جداگانه به کلاس اضافه کنم، که یکی بدون پارامتر و در واقع متد Create پیش‌فرض را مخفی می‌کند و دیگری نیز با چند پارامتر . با در نظر گرفتن کلمه کلیدی Overload، پیاده‌سازی این دو Constructor به شکل زیر خواهد بود :



type
TDate = class
public
constructor Create; overload;
constructor Create (y, m, d: Integer); overload;