2011-07-22 22 views

cevap

3

Çoğu durumda, yöntemlerde self kullanmamalısınız. Eğer akımı belirtmek istediğinizde

type 
    TMyClass = class 
    public 
    Value: string; 
    procedure MyMethod; 
    procedure AddToList(List: TStrings); 
    end; 


procedure TMyClass.MyMethod; 
begin 
    Value := 'abc'; 
    assert(self.Value='abc'); // same as assert(Value=10) 
end; 

self kullanılacak: örtük bir self. öneki varsa gibi bir sınıf yöntemi içinde, sınıf özelliklere ve yöntemlere erişmek Aslında

, bu kadar Başka bir yönteme veya nesneye nesne. Örneğin

: Bu Yukarıdaki kod TMyClass örneğine işaret List.Objects [] ile, TStrings listesine öğe ekleyecektir

procedure TMyClass.AddToList(List: TStrings); 
var i: integer; 
begin 
    List.AddObject(Value,self); 
    // check that the List[] only was populated via this method and this object 
    for i := 0 to List.Count-1 do 
    begin 
    assert(List[i]=Value); 
    assert(List.Objects[i]=self); 
    end; 
end; 

. Ve Listenin tüm öğeleri için durumun böyle olduğunu kontrol edecektir.

+0

@AB - "örtülü kendini" - herhangi bir iç sınıf üyesine başvururken 'ben' gerektiren Python'la uğraşmaya başladığımdan beri, bunu Delphi'de yapmaya başladım - üstelik onu stilist olarak beğenmedim mi, değil mi kodun daha hızlı taranmasını kolaylaştırıyor gibi görünüyor. – Vector

+0

@Mikey Delphi'deki genel uygulama 'self.' önekini kullanmamaktır. Aslında IDE intellisense, özellik adlarına hızlı bir şekilde erişmenizi ya da fare pop-up ipucu veya Ctrl + Click ile bildirimi görmenizi sağlar - bu nedenle bu öneki belirtmeniz gerekmez.Kodunuzdaki genel değişkenleri tanımlamazsanız (bu iyi kod için gereklidir), yöntem kodunuzdaki tanımlayıcıların özellik/yöntem adları olduğunu bilirsiniz. Bu nedenle, yöntemlerinizde 'self.' önekini kullanmamalısınız (' '' ifadesi içinde değilse). –

+0

@AB - Söylediginiz her şeyi biliyorum ve katılıyorum ama bunun nedenini kullanmamın sebebi yok. Eğer bir kod parçasını taramak/hızlandırmak istiyorsanız, 'kendi' yardımcı olur - genellikle arkamıza yaslanmayı ve sadece herhangi bir fare veya etkileşim olmadan kodu okumu yapmayı severim, ve yine de kodu yazdırmak ve okumak isterim. Bu yüzden "kendi kendine yardım" yaklaşımı .... LOL – Vector

9

Delphi'de Kendilik buna denktir. Ayrıca here'da açıklandığı gibi atanabilir.

+3

Not: Bu, değere göre geçirildiği için, Self'e atanmak çok kullanışlı olmamasına rağmen yapılabilir. Bazılarının bekleyebildiği gibi, bir kurucudan “geri dönüş” olmayacaktır (yapıcılar aslında hiçbir şeyi "geri döndürmez" - atama sözdizimi sadece bir kolaylıktır). –

+1

Hmmm ... Gördüğünüz soyadınızdaki insanlar aynı şeyi söylediniz. –

+0

Kendime Atamak bir köşe davasıdır ve normalde kötü bir uygulama olarak düşünülebileceği için bunu yapmanız gerekmez. Yine de, Self'i bir sınıfa başvuru olarak kullanmak, yalnızca standart olmayan adlandırma kurallarını kullanıyorsa kullanışlıdır. Standart kurallar F'nin sınıf değişkenlerinin bir öneki (örnek olarak FIsCorrect) ve A prosedür/fonksiyon argümanları olarak (AIsCorrect) kullanılmasıdır. Daha sonra, sınıf değişkenlerinin atanması FIsCorrect kadar basit olacaktır: = AIsCorrect, alternatif olarak Self.IsCorrect kullanmanız gerekir: = function (procedure) argümanı isCorrect: IsCorrect: Boolean. – too