Delphi dilinin bir özelliği birkaç yıl önce eklendi (geri dönüş yolu) Delphi 2005'te) "Class Helpers" olarak adlandırılan), sınıfa (kayıt) yeni yöntemler ekleyerek mevcut bir sınıfa (veya kayda) yeni işlevler eklemenize olanak sağlamak için tasarlanmıştır.
Aşağıda, sınıf yardımcıları + sınıf yardımcılarının ne zaman ve ne zaman kullanılmayacağını öğrenecek bazı fikirler göreceksiniz.
Sınıf Yardımcısı...
Basit bir deyişle, sınıf yardımcısı, yardımcı sınıfta yeni yöntemler tanıtarak bir sınıfı genişleten bir yapıdır. Sınıf yardımcısı, var olan sınıfı gerçekte değiştirmeden veya miras almadan genişletmenizi sağlar.
VCL'nin TStrings sınıfını genişletmek için aşağıdaki gibi bir sınıf yardımcısı beyan edip uygularsınız:
tip
TStringsHelper = için sınıf yardımcısı TStrings. halka açıkfonksiyon İçeren (const aString: string): boolean; son;
"TStringsHelper" adı verilen yukarıdaki sınıf, TStrings türü için bir sınıf yardımcısıdır. TStrings öğesinin, varsayılan olarak herhangi biri için kullanım yan tümcesinde kullanılabilen bir birim olan Classes.pas içinde tanımlandığını unutmayın.
Delphi örneğin birimin birimi.Sınıf yardımcımızı kullanarak TStrings türüne eklediğimiz işlev "İçerir". Uygulama şöyle görünebilir:
fonksiyon TStringsHelper. İçeren (const aString: string): boolean; başla
sonuç: = -1 son;
Yukarıdaki birçok kez kodunuzda kullandığınızdan eminim - TStringList gibi bazı TStrings soyundan, Öğeleri koleksiyonunda bazı dize değeri olup olmadığını kontrol etmek için.
Örneğin, bir TComboBox veya TListBox, TStrings türündedir.
TStringsHelper ve bir formdaki liste kutusu ("ListBox1" olarak adlandırılır) uygulandığında, şimdi bazı dizelerin liste kutusu Öğeleri özelliğinin bir parçası olup olmadığını kontrol ederek şunları yapabilirsiniz:
Eğer ListBox1.Items. İçerik ('bazı dize') sonra...
Sınıf Yardımcıları Git ve NoGo
Sınıf yardımcılarının uygulanmasının kodlamanız üzerinde bazı olumlu ve bazı (düşünebilirsiniz) olumsuz etkileri vardır.
Genel olarak kendi sınıflarınızı genişletmekten kaçınmalısınız - sanki yeni bir işlevsellik eklemeniz gerekiyormuş gibi kendi özel sınıflarınız - yeni uygulamaları sınıf uygulamasına doğrudan ekleyin - sınıf kullanmayın yardımcı.
Bu nedenle sınıf yardımcıları, normal sınıf mirasına ve arayüz uygulamalarına güvenemeyeceğiniz (veya gerek duymadığınız) bir sınıfı genişletmek için daha fazla tasarlanmıştır.
Sınıf yardımcısı, yeni özel alanlar (veya bu alanları okuyacak / yazacak özellikler) gibi örnek verileri bildiremez. Yeni sınıf alanlarının eklenmesine izin verilir.
Sınıf yardımcısı yeni yöntemler ekleyebilir (işlev, yordam).
Delphi XE3'ten önce yalnızca sınıfları ve kayıtları genişletebilirsiniz - karmaşık türler. Delphi XE 3 sürümünden tamsayı veya dize veya TDateTime gibi basit türleri de genişletebilir ve aşağıdaki gibi bir yapıya sahip olabilirsiniz:
var
s: dize; başla
s: = 'Delphi XE3 yardımcıları'; s: = s. UpperCase. Ters; son;
Yakın gelecekte Delphi XE 3 basit tip yardımcı hakkında yazacağım.
Sınıf Yardımcılarım Nerede
"Ayakta vurmanıza" yardımcı olacak sınıf yardımcılarını kullanmanın bir sınırlaması, birden fazla yardımcıyı tek bir türle tanımlayabilmeniz ve ilişkilendirebilmenizdir. Ancak, kaynak kodundaki belirli bir konuma yalnızca sıfır veya bir yardımcı uygulanır. En yakın kapsamda tanımlanan yardımcı geçerli olacaktır. Sınıf veya kayıt yardımcısı kapsamı normalde belirlenir Delphi moda (örneğin, ünitenin kullanım fıkrasında sağdan sola).
Bunun anlamı, iki farklı birimde iki TStringsHelper sınıfı yardımcısı tanımlayabilmenizdir, ancak gerçekte kullanıldığında yalnızca bir tanesi uygulanır!
Bir sınıf yardımcısı, tanıtılan yöntemlerini kullandığınız birimde tanımlanmamışsa - ki bu çoğu durumda böyle olacaktır, gerçekte hangi sınıf yardımcı uygulamasını kullanacağınızı bilemezsiniz. TStrings için farklı adlandırılmış veya farklı birimlerde ikamet eden iki sınıf yardımcısının yukarıdaki örnekte "İçerir" yöntemi için farklı uygulamaları olabilir.
Kullanın veya Kullanmayın?
Evet, ancak olası yan etkilerin farkında olun.
Yukarıda belirtilen TStringsHelper sınıfı yardımcısının kullanışlı bir uzantısı daha var
TStringsHelper = için sınıf yardımcısı TStrings. özelfonksiyon GetTheObject (const dizi: sicim): TObject; prosedür SetTheObject (const dizi: sicim; const Değer: TObject); halka açıkEmlak ObjectFor [const dizi: sicim]: TObject okumak GetTheObject yazmak SetTheObject; son;... fonksiyon TStringsHelper. GetTheObject (const dizi: sicim): TObject; var
idx: tam sayı; başla
sonuç: = sıfır; idx: = IndexOf (aString); Eğer idx> -1 sonra sonuç: = Nesneler [idx]; son; prosedür TStringsHelper. SetTheObject (const dizi: sicim; const Değer: TObject); var
idx: tam sayı; başla
idx: = IndexOf (aString); Eğer idx> -1 sonra Nesneler [idx]: = Değer; son;
Eğer olduysan bir dize listesine nesne ekleme, yukarıdaki kullanışlı yardımcı özelliğini ne zaman kullanacağınızı tahmin edebilirsiniz.