PDA

View Full Version : سوال: نحوه تعريف كلاس ؟؟



Majid.Ebru
دوشنبه 29 شهریور 1389, 14:54 عصر
با سلام
خواهش مي كنم اگه كسي مي دونه يه توضيحي درباره تعريف اين دو كلاس ، بده . ممنون ميشم.
1 - فرض كنيد كلاسي به نام TEmployee داريد تعريف كلاس TEmployeeClass به اين صورت TEmployeeClass = class of TEmployee
يعني چي ؟
2 - فرض كنيد كلاسي به نام TEmployee داريد تعريف كلاس TEmployeeLIst به اين صورت TEmployeeList = class (TObject <TEmployee>)
يعني چي ؟
با تشكر فراوان

baradar
دوشنبه 29 شهریور 1389, 16:42 عصر
یعنی این کلاس از کلاس TObject که والد تمام کلاسهای دلفی است ارث می برد

SAASTN
دوشنبه 29 شهریور 1389, 19:32 عصر
- فرض كنيد كلاسي به نام TEmployee داريد تعريف كلاس TEmployeeClass به اين صورت TEmployeeClass = class of TEmployee
يعني چي ؟
این نوع تعریف معمولا برای TListها و TCollectionها به کار میره، شما فرض کنید دو نوع کارمند دارید که در لیستهای جداگونه نگهداری می شن مثل: TMaleEmployee و TFemaleEmployee. که مشخصات و روتین های جداگونه دارند. حالا یه کلاس از نوع نگهدارنده لیست داریم که قراره لیستی از این کلاسهای TMaleEmployee یا TFemaleEmployee رو نگهداری کنه. (یه بار دیگه هم روی اون یا تاکید می کنم، چون توی این وضعیت فرض بر اینه که عناصر داخل لیست از یک نوع هستند). اما نکته اینجاست که این کلاس لیستمون تنها یک بار تعریف میشه، یعنی غیر از عناصر داخل لیست هیچ تفاوتی بین مشخصات و روتین های لیستها وجود نداره. حالا فرض کنید که می خوایم برای این لیست یه متد Add بنویسیم:
type
TEmployee = class
// some properties for employee
end;
TMaleEmployee = class(TEmployee)
// some EXTRA properties for MALE employee
end;
TFemaleEmployee = class(TEmployee)
// some EXTRA properties for FEMALE employee
end;

TEmployeeList = class(TList)
public
function Add: TEmployee;
end;

{ TEmployeeList }

function TEmployeeList.Add: TEmployee;
begin
Result := TEmployee.Create;
inherited Add(Result);
end;

خوب مشکل کد بالا اینه که تابع Add یه نمونه از کلاس TEmployee میسازه. در صورتی که می خوایم دوتا نمونه از لیست بسازیم یکی برای برادران و یکی برای خواهران! که توی اولی باید از TMaleEmployee یه نمونه ایجاد بشه و برای دومی از TFemaleEmployee. برای اینکه این مشکل حل بشه دو راه حل هست: یکی این که TEmployeeList دوبار نوشته بشه بصورت: TMaleEmployeeList و TFemaleEmployeeList. که همونطور که در ابتدا گفته شد این چیزی نیست که ما می خوایم چون لیستها غیر از عناصر داخلشون تفاوت دیگه ای ندارن. راه دوم استفاده از همون روشی هست که پرسیدید: یه مشخصه برای لیستمون تعریف می کنیم که نوع عناصر داخلش رو مشخص کنه:
TEmployee = class
// some properties for employee
end;
TEmployeeClass = class of TEmployee;
TMaleEmployee = class(TEmployee)
// some EXTRA properties for MALE employee
end;
TFemaleEmployee = class(TEmployee)
// some EXTRA properties for FEMALE employee
end;

TEmployeeList = class(TList)
private
FEmployeeClass: TEmployeeClass;
public
property EmployeeClass: TEmployeeClass read FEmployeeClass write FEmployeeClass;
function Add: TEmployee;
end;

{ TEmployeeList }

function TEmployeeList.Add: TEmployee;
begin
Result := FEmployeeClass.Create;
inherited Add(Result);
end;

برای ایجاد لیست ها هم:
var
MaleEmployees, FemaleEmployees: TEmployeeList;
begin
MaleEmployees := TEmployeeList.Create;
MaleEmployees.EmployeeClass := TMaleEmployee;
FemaleEmployees := TEmployeeList.Create;
FemaleEmployees.EmployeeClass := TFemaleEmployee;
end;

امیدوارم تونسته باشم برسونم.

vcldeveloper
سه شنبه 30 شهریور 1389, 06:30 صبح
فرض كنيد كلاسي به نام TEmployee داريد تعريف كلاس TEmployeeClass به اين صورت TEmployeeClass = class of TEmployee
يعني چي ؟
به این میگن class reference. یک class reference یک اشاره گر به تعریف یک نوع class هست، و از اون میشه برای Create کردن اشیاء جدید یا دسترسی به متدها و خصوصیات یک کلاس (منظور Instance method ها نیست) یا کلاس های مشتق شده از آن، استفاده کرد. نمونه کاربردش میشه همون چیزی که SAASTN توضیح دادند.


فرض كنيد كلاسي به نام TEmployee داريد تعريف كلاس TEmployeeLIst به اين صورت TEmployeeList = class (TObject <TEmployee>)
يعني چي ؟
شکل درستش اینطوری هست:

TEmployeeList = class(TObjectList<TEmployee>)
این تعریف یک کلاس با نام TEmployeeList هست که از یک کلاس با نام TObjectList<> مشتق میشه. <>TObjectList یک کلاس Generic هست، یعنی میتونه در هنگام تعریف خودش، نام یک یا چند نوع داده را به عنوان پارامتر دریافت کنه و روی آن نوع خاص کار انجام بده. در اون کد، کلاس TEmployee به عنوان پارامتر مربوطه تعیین شده.

TObjectList کارش نگهداری لیستی از اشیاء است. پارامتر TEmployee بهش میگه که اشیاء نگهداری شده در آن از نوع کلاس TEmployee (و کلاس های مشتق شده از آن) خواهند بود. حالا TEmployeeList به عنوان یک کلاس جدید، اومده این لیستی از اشیاء از نوع TEmployee را توسعه داده و قابلیت هایی بهش اضافه کرده.