2012-12-08 18 views
10

Zastanawiam się, dlaczego zakres typów zagnieżdżonych nie zawiera klas pochodnych w Delphi; może to uczynić kod bardziej czysty:Dlaczego zakresy typów zagnieżdżonych nie obejmują klas pochodnych?

type 
    TBaseTest = class 
    public type 
    PVector = ^TVector; 
    TVector = record 
     A, B, R: Integer; 
    end; 
    public 
    procedure Execute(var Vector: TVector); virtual; abstract; 
    end; 

    TTestA = class(TBaseTest) 
    public 
// E2003 Undeclared identifier: 'TVector' 
    procedure Execute(var Vector: TVector); override; 
// workaround: 
// procedure Execute(var Vector: TBaseTest.TVector); override; 
    end; 
+3

Nie nazwałbym twojego "obejścia" obejściem problemu. Jak odróżnić TVector, które są zagnieżdżonymi typami dwóch różnych klas? Chociaż, wprawdzie, w klasach pochodnych może domyślnie być TVCorem typu podstawowego ... –

+2

Zgaduję, że projektanci chcieli uniknąć niejednoznaczności. Być może nauczyli się od lat pracy z upiornym stwierdzeniem "z". –

+1

Możliwe rozwiązanie polega na wprowadzeniu "zaplombowanych" typów zagnieżdżonych, tj. Typów, których nie można ponownie zadeklarować w klasach pochodnych. – kludg

Odpowiedz

0

Jeśli się nie mylę, kiedy piszesz TVertor w TBaseTest, kompilator wygląda na to pierwszy w tej klasie, a następnie w tym urządzeniu, a następnie w modułach w Używa sekcję. Dlatego możesz napisać prosty TVector, oznaczający TBaseTest.TVector.

Kiedy piszesz klasę TTestA, wywodzącą się z TBaseTest i używasz tam TVector, najpierw sprawdza TTestA (nie ma TVectora), potem w tym module (nie ma też TVectora), a następnie w Zastosowaniach. Jeśli chcesz użyć wewnętrznej klasy testu TBaseTest, powinieneś napisać bezpośrednio TBaseTest.TVector, ponieważ TVector jest zdefiniowany w TBaseTest, a nie w TTestA.

+0

Ostatnie zdanie jest raczej bezcelowe. Powtarza to, co pojawia się w pytaniu. –

+0

Miałem na myśli, że wewnętrzne klasy nie są dziedziczne, jak TBaseTest.TVector i TTestA.TVector są różne. – omickron

+0

Jest to określone w pytaniu. Pytanie brzmi, dlaczego konstrukcja jest właśnie taka. –

Powiązane problemy