2016-08-02 13 views

Antwort

5

Der Beispielcode (der jetzt gelöscht wurde) tut nicht das, was er zu tun scheint. Sie sehen TMycxGridDBTableView wird als ein Nachkomme von TcxGridDBTableView definiert, und dann sehen Sie TcxGridDBTableView, definiert als ein Nachkomme von TcxGridDBTableView.

Allerdings ist die TcxGridDBTableView Sie oben sehen nicht gleich TcxGridDBTableView, die Sie später sehen. Die erste bezieht sich auf eine Klasse, die an anderer Stelle in einer anderen Einheit deklariert wurde. Das nächste Vorkommen ist die Deklaration einer neuen Klasse in diese Einheit, die zufällig denselben Basisnamen wie die Klasse der anderen Einheit hat.

Diese Technik ist bekannt als Interposer-Klasse. Es wird verwendet, um eine neue GetViewDataClass Methode einzuführen, aber immer noch mit dem gleichen Klassennamen. Das Formular, das Steuerelemente mit diesem Namen verwendet, verwendet die neue Version der Klasse anstelle der ursprünglichen Version. Es ist eine Möglichkeit, ein VCL-Steuerelement anzupassen, ohne ein benutzerdefiniertes Paket kompilieren und installieren zu müssen.

+0

Schön, nach -2 Stimmen dachte ich, dass ich nie eine Antwort bekommen würde, ich schätze, du kannst keinen Fehler machen, selbst wenn du nicht sicher bist, wovon du redest. Warum wurde der Beispielcode gelöscht? Copyright oder etwas? –

+0

Ich löschte es, weil es die Frage änderte. Sie sollten den Rat in meinen Kommentaren beherzigen und eine neue Frage stellen. –

+0

@ David: Aber es war ein Beispiel für das, was er beschrieben, d. H. TSon von TFather und TFather von TSon erben. Dass der erste TFather in einer anderen Einheit war, war nicht sofort offensichtlich. –

3

Ich weiß nicht, wie es heißt, aber es macht keinen Sinn. Es ist einfach unmöglich.

Wenn ich versuche, diesen Code zu kompilieren:

type 
    TFather = class; 
    TSon = class(TFather) 
    end; 
    TFather = class(TSon) 
    end; 

ich:

[dcc32 Error] Project1.dpr(12): E2086 Type 'TFather' is not yet completely defined 

und das ist, wie erwartet.

Zyklische Vererbung ist eine Fehlerbedingung in Java. Sie erhalten eine Diagnose, die "zyklische Vererbung" erwähnt, wenn so etwas direkt oder indirekt passiert (d. H. Mit ein paar Klassen dazwischen). Mit anderen Worten, es ist kein Programmierkonzept, es ist eine Fehlerbedingung.

+0

FWIW Ich denke in Java und auch C# (es gibt den Kompilierfehler [CS0146] (https://msdn.microsoft.com/en-us/library/kty4k630.aspx)) diese diagnostische Information macht Sinn und ist notwendig, weil Sie diese Klassen in verschiedenen Dateien haben können, aber im selben Namespace, damit sie sich kennen.In Delphi wegen der Art und Weise, wie Sie dies verhindern, ist es nicht möglich. –

+0

@Stefan: tatsächlich. Aber es ist kein Konzept, es ist eine Fehlersituation. Ich kann mir nicht vorstellen, dass das OP dies in realem Code gesehen hat. –

4

Unsinn. Sie können TSon mit einer Eigenschaft vom Typ TFather und TFather mit einer Eigenschaft TSon haben, aber was Sie geschrieben haben, ist reiner Unsinn.

Im Folgenden macht einen Sinn, hat aber keinen speziellen Begriff, da es keine Rekursion:

type 
    TFather = class; 
    TSon = class 
    public 
     Father : TFather; 
    end; 
    TFather = class 
    public 
     Son : TSon; 
    end; 
+0

Tatsächlich ist das möglicherweise das, was das OP wirklich gesehen hat. –

1

Was heißt das?

Der Fachausdruck ist Syntaxfehler. Dieser Code ist illegal.