我想你誤會什麼Self
是,如何對象引用在德爾福工作。
包含類實例的變量已經是指向該對象實例的指針。爲了方便起見,Delphi編譯器僅允許您省略解引用運算符(^
)。
var
MyObject: TMyObject;
begin
MyObject := TMyObject.Create; // MyObject is now a pointer to an instance of TMyObject
...
的Delphi還允許訪問成員或對象實例的屬性時不使用引用操作的簡寫。再次,下面的代碼實際上是等效的:
MyObj.SomeProperty := SomeValue;
MyObj^.SomeProperty := SomeValue;
從Delphi documentation:
類類型的的變量實際上是引用一個對象的指針。因此,多個變量可以指向同一個對象。像其他指針一樣,類型變量可以保存值爲零。但是,您不必顯式取消引用類型變量來訪問它指向的對象。例如,SomeObject.Size:= 100將值100分配給由SomeObject引用的對象的Size屬性;你不會寫爲SomeObject^.Size:= 100
Self
是自動聲明的屬性指向對象的當前實例。換句話說,它在代碼中自動可用,該代碼實現該類來引用對象的當前實例。這可以讓你有同一對象的多個實例:
type
TMyObject=class(TObject)
private
FMyInteger: Integer;
function GetMyInteger: Integer;
procedure SetMyInteger(Value: Integer);
published
property MyInteger: Integer read GetMyInteger write SetMyInteger;
end;
...
function TMyObject.GetMyInteger: Integer;
begin
Result := Self.FMyInteger;
// Self is implied, so the above line can more simply be written as
// Result := FMyInteger;
end;
procedure TMyObject.SetMyInteger(Value: Integer);
begin
if (Value <> Self.FMyInteger) then // Self is again implied here
Self.FMyInteger := Value;
end;
var
MyObjOne, MyObjTwo: TMyObject;
i, j: Integer;
begin
MyObjOne := TMyObject;
// Here, the code inside TMyObject.SetInteger that
// uses `Self` would refer to `MyObjOne`
MyObjOne.MyInteger := 1;
MyObjTwo := TMyObject;
// Here, the code in TMyObject.SetInteger would be
// using the memory in `MyObjTwo` when using `Self`
MyObjTwo.MyInteger := 2;
end;
注意Self
是唯一有效的在實現類的代碼。它的問世,有效的TMyObject.GetMyInteger
和TMyObject.SetMyInteger
以上(在我的例子中唯一實現的代碼),並始終指向當前實例。
沒有必要跟蹤Self
的地址,作爲對象實例是Self
該對象實例的內部方法變量引用。這只是對象的該實例內有效,並總是是指對象實例。因此,在你的代碼示例,PSelf
只是浪費空間 - myobject
已經包含一個指向自己,那指針在myobject
方法自動可供選擇:
type
myobject = class; // Now automatically contains a `Self` pointer
// available in methods of the class once an
// instance is created
var
myobj: myobject;
begin
myobj := myobject.Create; // myobj.Self now is valid in methods of
// `myobject`
只是爲了您的信息,接受的答案,你認爲是「錯誤」的作者是[丹尼 - 索普(http://stackoverflow.com/users/301152/dthorpe),德爾福編譯器的前首席架構師(他在編譯器本身設計了特性),而他在Borland工作。 :-)我想他可能對他在說什麼有一個想法,他對這個問題的回答絕不是錯的。 ;-) –
我恢復了你的編輯,因爲它使問題無效。這也不是StackOverflow的工作原理。 :-)如果你有一個解決方案發布,發佈它作爲你自己的問題的答案。 [FAQ](http://stackoverflow.com/faq)有關於這樣做的信息。增加更多的內容來解釋你發現的問題,從原始問題的意義上分心,並且也可以完全無效你已經收到的答案的含義。 (而意見爲好,這是你的去除你沒掛到我以前的上述評論文章段落的:-)) –
我會得到它的竅門最終..:/ – AudioGL