PDA

View Full Version : مفهوم Procedure Of Object چیست ؟



rayangostar_co
سه شنبه 12 دی 1391, 10:52 صبح
با عرض سلام خدمت همه دوستان برنامه نویس

مفهوم دستور زیر و اکه کسی میدونه بگه .
توضیح کامل بدید ممنون میشم.


type

TClientStatus = procedure (const AClient: TClient) of Object;

یوسف زالی
سه شنبه 12 دی 1391, 10:57 صبح
سلام.
این یعنی یک نوع از نوع procedure که باید حتما در یک Object باشه.
مثال:


var
X: TClientStatus;
.
.
X := Obj1.OnSomething;
.
.
.
X; // running procedure

Felony
سه شنبه 12 دی 1391, 11:31 صبح
به اون نوع Method Pointer میگن ، در کل در در دلفی 2 نوع Method Pointer داریم ، اولی Method Pointer هایی که یک روال عادی به اون ها اختصاص داده میشه ، مثلا :


procedure test;
begin
ShowMessage('I''m test method');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
aMethod: procedure;
begin
aMethod:= test;
aMethod;
end;

دومیMethod Pointer هایی که متدی از یک شئ مشتق شده از کلاس به اونها نسبت داده میشه ، همونطور که یوسف گفت ، Of Object به این معناست که این Method ی که قراره به این نوع داده اختصاص پیدا کنه باید متدی از یک شئ باشه ، مثل همون مثال پست قبلی ، دلیل این تفاوت این هست که کامپایلر باید بدونه به چه متدی باید اشاره کنه ، در حقیقت اون انتصاب یک اشاره گر از متد رو در اون Data Type ذخیره میکنه نه یک کپی از اون رو ، بنا براین ممکنه من در برنامم همچین کدی داشته باشم :


type
TMyClass1= class
procedure test;
end;

type
TMyClass2=class
procedure test;
end;

-----------------------------------

{ TMyClass1 }

procedure TMyClass1.test;
begin
ShowMessage('I''m test method from TMyClass1');
end;

{ TMyClass2 }

procedure TMyClass2.test;
begin
ShowMessage('I''m test method from TMyClass2');
end;

خوب وقتی یکی از متدهای test از 2 کلاس بالا رو به یک Method Pointer اختصاص میدیم ، کامپایلر باید بدونه به کدوم شئ در زمان فراخوانی Method Pointer باید ارجاع کنه و متد مورد نظر ما رو از اون شئ فراخوانی کنه یا نه ؟ اگر یک Method Pointer معمولی تعریف کنید کامپایلر در زمان فراخوانی متد نمیتونه تشخصی بده باید به کدوم کلاس برای اجرای این متد ارجاع کنه و از کامپایل برنامه جلوگیری میکنه ولی وقتی Method Pointer رو به صورت of Object تعریف کنید به کامپایلر میگید علاوه بر آدرس متد مورد نظر من ، آدرس شئ مورد نظر که این متد متعلق به اون هست رو هم در Method Pointer نگهداری کن ، با این کار وقتی متدی از یک شئ که از یک کلاس به ارث برده شده رو به Method Pointer تعریف شده اختصاص میدید هم آدرس شئ و هم آدرس اون متد ذخیره میشه و در هنگام فراخوانی کامپایلر دقیقا میدونه باید به فلان متد از فلان شئ از فلان کلاس مراجعه کنه .

موفق باشید .