2010-02-10 11 views
5

Czy rozszerzony protokół RTTI w Delphi 2010 oferuje sposób na zdefiniowanie zdefiniowanego Class and Record Helpers w czasie wykonywania?Znajdź wszystkie programy pomocnicze klasy w Delphi w czasie wykonywania za pomocą RTTI?

Z tego co wiem, Delphi does not show a hint or warning, gdy dla klasy zdefiniowano więcej niż jednego pomocnika klasy, wykrywanie pomocnika w klasie może być pomocne w "zapewnieniu jakości".

p.s. oczywiście wiem, że nigdy nie powinienem używać komponentów ani bibliotek stron trzecich bez kodu źródłowego, co ułatwiłoby ci pomocników klasy.

+2

To nie ma znaczenia, czy więcej niż jeden pomocnik jest zdefiniowane w czasie wykonywania. Jeśli spróbujesz użyć metod wprowadzonych przez pomocnika innego niż ostatnio zdefiniowany, twój kod nawet się nie skompiluje, więc * nie ma * czasu działania. –

+0

@Rob: cytuj z połączonej strony (Turbocharging Delphi 2010): "możesz zdefiniować i powiązać wiele pomocników klasy z jednym typem klasy" - oznacza to, że jeśli powiążę wielu pomocników klasy z jedną klasą, kod nie skompiluje się już więcej? – mjn

+1

Możesz utworzyć wielu pomocników, ale tylko jeden będzie działać naraz. Kontynuuj czytanie cytowanego właśnie zdania: "tylko zero lub jeden pomocnik klasy ma zastosowanie w konkretnej lokalizacji w kodzie źródłowym.Operator klasy zdefiniowany w najbliższym zakresie.Operacja klasy pomocnika jest określona w normalny sposób w Delphi (tzn. Prawo do pozostawione w klauzuli uses jednostki) " –

Odpowiedz

9

Ponieważ pomocnicy klasy odnoszą się tylko do klasy opartej na tym, który helper jest "najbliższy" w zakresie, klasa po prostu nie może wiedzieć, że pomocnik istnieje. Na przykład możesz stworzyć pomocnika klasy w swoim urządzeniu, aby "pomóc" klasie z innej jednostki, dla której nie masz źródła. Klasa w drugiej jednostce nie ma pojęcia o żadnym pomocniku. Gdyby posiadała tę wiedzę, musiałaby zostać zrekompilowana, aby wziąć to pod uwagę ... co prowadzi do następnego problemu;

Rozważ to: Możesz zadeklarować klasę w jednej wspólnej jednostce, która jest używana przez wiele innych jednostek w twojej aplikacji. W każdej z tych jednostek deklarujesz nowego pomocnika dla tej wspólnej klasy za pomocą różnych metod i funkcji "pomocnika". Ponieważ każda jednostka nie wie nic o innych jednostkach, które również deklarują własnego pomocnika, nie ma sposobu, aby w jakiś sposób połączyć wszystkich pomocników. Rozważmy teraz, że ta wspólna jednostka żyje teraz na wstępnie skompilowanej granicy pakietu.

Klasy pomocników są uwodzicielskimi małymi poganami. Obiecują sławę i fortunę, ale zbyt często padają ofiarą śmierci i zniszczenia ... długo po tym, jak oddaliście się ich sztuczkom.

Z tego powodu ich wprowadzenie do języka rozwiązało bardzo specyficzne problemy, a mianowicie możliwość "pojawienia się" w celu wprowadzenia funkcjonalności do istniejącej struktury. Dopóki przestrzegasz zasady "tylko jeden pomocnik" i nie zboczysz z tej ścieżki, możesz wyjść stosunkowo nietknięta. Bez względu na to, będziesz potrzebował połączonej siły jelitowej Beowulfa, Leonidasa (Sparty) i Frodo Bagginsa, aby móc nawigować po tych wodach.

Biorąc pod uwagę, że tutaj, w zespole RAD Studio, nie chcemy używać klasowego pomocnika tam, gdzie można go uniknąć. A kiedy używamy ich odpowiednia falanga powstaje zanim jeszcze rozpocznie ...

ma być smoki tutaj ...

+3

+1 dla smoków. :-) Cóż, powinieneś wprowadzić nową widoczność dla pomocników klasy o nazwie ** Intestinal ** i mieć to zarezerwowane dla zespołu R & D i kilku Paladynów na krwawiących krawędziach ...

+2

Ya know, I Zawsze zastanawiałem się, dlaczego tak zostało wdrożone. Dlaczego pomocnicy klas muszą być tak przerażeni, że nawet zespół Delphi się ich boi?Dlaczego jesteśmy ograniczeni do korzystania tylko z jednej klasy w danym czasie? –

+0

Ma to głównie związek z regułami ustalania zakresu języka. Nie zamierzaliśmy łamać tych zasad, ponieważ spowodowałoby to jeszcze większą przepaść. Nie są przerażające, jeśli i tylko wtedy, gdy naprawdę, naprawdę zrozumiesz zasady i ich pułapki. Problemy pojawiają się, gdy używasz helperów jako integralnej części API twojego frameworka. Wtedy ryzykujesz prawdziwym zmaganiem się z pojedynkowymi pomocnikami. –

Powiązane problemy