Zrozumienie pomocników klasy Delphi (i rekordów)

Programiści komputerowi

Getty / PeopleImages.com





Funkcja języka Delphi dodana kilka lat temu (z powrotem w w Delphi 2005 ) o nazwie „Pomocnicy klas” mają na celu umożliwienie dodania nowych funkcji do istniejącej klasy (lub rekordu) poprzez wprowadzenie nowych metod do klasy (rekordu).

Poniżej zobaczysz więcej pomysłów na pomocników klas + dowiedz się, kiedy i kiedy nie używać pomocników klas.



Pomocnik klasy dla...

Mówiąc prościej, pomocnik klasy to konstrukcja, która rozszerza klasę, wprowadzając nowe metody w klasie pomocniczej. Pomocnik klasy pozwala na rozszerzenie istniejącej klasy bez faktycznego jej modyfikowania lub dziedziczenia po niej.

Aby rozszerzyć klasę TStrings VCL, należy zadeklarować i zaimplementować pomocnik klasy, taki jak:



|_+_|

Powyższa klasa o nazwie 'TSringsHelper' jest klasą pomocniczą dla typu TStrings. Zauważ, że TStrings jest zdefiniowany w Classes.pas, jednostce, która jest domyślnie dostępna w klauzuli uses dla każdegoDelfyna przykład jednostka formularza.

Funkcja, którą dodajemy do typu TStrings za pomocą naszego pomocnika klasy, to 'Contains'. Wdrożenie mogłoby wyglądać tak:

|_+_|

Jestem pewien, że wielokrotnie używałeś powyższego w swoim kodzie - aby sprawdzić, czy jakiś potomek TStrings, taki jak TStringList, ma jakąś wartość ciągu w swojej kolekcji Items.

Zauważ, że na przykład właściwość Items aTComboBoxlub TListBox jest typu TStrings.



Mając zaimplementowany TStringsHelper i pole listy w formularzu (o nazwie „ListBox1”), możesz teraz sprawdzić, czy jakiś ciąg jest częścią właściwości Items pola listy, używając:

|_+_|

Pomocnicy klas Go i NoGo

Implementacja pomocników klas ma pewien pozytywny i pewien (możesz pomyśleć) negatywny wpływ na twoje kodowanie.



Ogólnie rzecz biorąc, powinieneś unikać rozszerzania własnych klas - tak jakbyś musiał dodać jakąś nową funkcjonalność do własnych niestandardowych klas - dodawać nowe rzeczy bezpośrednio w implementacji klasy - nie używając pomocnika klas.

Pomocnicy klas są zatem bardziej zaprojektowane do rozszerzania klasy, gdy nie możesz (lub nie musisz) polegać na normalnym dziedziczeniu klas i implementacjach interfejsów.



Pomocnik klasy nie może deklarować danych instancji, takich jak nowe pola prywatne (lub właściwości, które odczytywałyby/zapisywały takie pola). Dozwolone jest dodawanie nowych pól klas.

Pomocnik klasy może dodawać nowe metody (funkcje, procedury).



Przed Delphi XE3 można było tylko rozszerzać klasy i rekordy - typy złożone. Od wydania Delphi XE 3 możesz również rozszerzać proste typy, takie jak integer lub string lub TDateTime, i mieć konstrukcje takie jak:

|_+_|

O pomocy typu prostego Delphi XE 3 napiszę w niedalekiej przyszłości.

Gdzie jest pomocnik mojej klasy

Jedynym ograniczeniem korzystania z pomocników klasowych, które mogą pomóc ci „strzelić sobie w stopę”, jest fakt, że możesz zdefiniować i powiązać wielu pomocników z jednym typem. Jednak tylko zero lub jeden pomocnik ma zastosowanie w określonej lokalizacji w kodzie źródłowym. Obowiązuje pomocnik zdefiniowany w najbliższym zakresie. Zakres pomocnika klasy lub rekordu jest określany w trybie normalnym Delfy moda (na przykład od prawej do lewej w klauzuli używa jednostki).

Oznacza to, że możesz zdefiniować dwa pomocniki klasy TStringsHelper w dwóch różnych jednostkach, ale tylko jeden będzie miał zastosowanie, gdy zostanie faktycznie użyty!

Jeśli klasowy helper nie jest zdefiniowany w jednostce, w której używasz wprowadzonych przez niego metod - co w większości przypadków tak będzie, nie wiesz, jakiej implementacji klasowego helpera używasz. Dwie klasy pomocnicze dla TStrings, nazwane inaczej lub znajdujące się w różnych jednostkach, mogą mieć inną implementację dla metody 'Contains' w powyższym przykładzie.

Używać czy nie?

Tak, ale bądź świadomy możliwych skutków ubocznych.

Oto kolejne przydatne rozszerzenie do wspomnianego wyżej helpera klasy TStringsHelper

|_+_|

Jeśli byłeś dodawanie obiektów do listy ciągów , możesz zgadnąć, kiedy użyć powyższej przydatnej właściwości pomocniczej.