Zrozumienie pomocników klasy Delphi (i rekordów)
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.