2012-12-08 14 views
10

Mi chiedo perché l'ambito dei tipi annidati non includa classi derivate in Delphi; potrebbe rendere il codice più pulito:Perché l'ambito dei tipi nidificati non include le classi derivate?

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

Non definirei la "soluzione alternativa" come soluzione alternativa. Come distinguere tra TVector che sono tipi annidati di due classi diverse? Anche se, ammettiamolo, nelle classi derivate si poteva impostare di default il TVector del tipo di base ... –

+2

Direi che i progettisti volevano evitare l'ambiguità. Forse hanno imparato da anni di lavoro con l'orribile frase 'with'. –

+1

la soluzione possibile sta introducendo tipi nidificati "sigillati", ovvero i tipi che non possono essere riprogrammati nelle classi derivate. – kludg

risposta

0

Se non mi sbaglio, quando si scrive TVertor nel TBaseTest, il compilatore lo cerca prima in questa classe, quindi in questa unità, quindi in moduli negli usi sezione. Ecco perché puoi scrivere TVector semplice, ovvero TBaseTest.TVector.

Quando si scrive una classe TTestA, derivata da TBaseTest, e si utilizza TVector, appare prima in TTestA (non c'è TVector), quindi in questo modulo (non c'è anche TVector), quindi in Uses. Se si desidera utilizzare la classe interna di TBaseTest, è necessario scrivere direttamente TBaseTest.TVector, perché TVector è definito in TBaseTest, non in TTestA.

+0

L'ultima frase è piuttosto inutile. Ripete ciò che appare nella domanda. –

+0

Intendevo dire che le classi interne non sono ereditabili, come TBaseTest.TVector e TTestA.TVector sono diversi. – omickron

+0

Questo è indicato nella domanda. La domanda sta chiedendo perché il design è il motivo per cui lo è. –

Problemi correlati