2010-12-02 8 views
0

Habe ich einen Fall, in Delphi wie:Zwei Klassen in zwei Geräten mit gleichem Klassennamen in Delphi

Einheit enthält eine Klasse „One“ Einheit B enthält Klasse „One“

Ich bin in einer Klasse, die Unit A verwendet und eine statische Funktion aus der Klasse One in B verwenden möchte; wie mache ich es? In C# würde ich etwas wie schreiben:

B.One.SomeProcedure 

Oder sogar ich würde "verwenden" verwenden, um einen Namespace "umzubenennen". Was kann ich in Delphi machen? (Die „Verwendung“ für die Einheit A Entfernen ist keine Option, noch ist eine der beiden Klassen umbenannt.)

Edit: Ich verwende Delphi 2007

+1

Wenn Sie gerade eine verkürzte Version Ihres Codes gepostet haben, können wir Ihnen sofort die Lösung sagen –

+0

Der genaue Code ist nicht wirklich wichtig; Das fehlende Teil war, dass beide Einheiten in der Klausel "uses" sein müssen. Aus einem C# -Hintergrund kommend, verwirrte mich das, bis ich es herausfand. (C# ermöglicht vollständig qualifizierte Namespaces, ohne dass andere Einheiten importiert werden.) – ashes999

Antwort

1

Sie können die folgende Art und Weise verwendet werden: [EinheitenName]. [Funktion]. Zum Beispiel B.SomeProcedure

+0

Ich habe sowohl B.SomeProcedure als auch B.One.SomeProcedure versucht; beide geben mir Kompilierungsfehler – ashes999

+3

Im Gegensatz zu C# sollte die Einheit immer noch in der Verwendungsliste sein, trotz der Tatsache, dass Sie einen voll qualifizierten Namen verwenden. – Davita

+0

Es würde helfen, uns zu sagen, welche Kompilierungsfehler Sie bekommen. Was Davita vorgeschlagen hat, funktioniert definitiv. – dummzeuch

1

Sie können genau dasselbe tun. UnitName.ClassName.Method, genau wie in C#.

+0

Sie müssen beide Einheiten in der Klausel" uses "haben verwirrend, weil ich an C# gewöhnt bin, wo Sie nicht beide Namespaces importieren müssen – ashes999

2

Was meinen Sie mit "eine Klasse, die verwendet"? Vielleicht meinst du "eine Einheit, die verwendet"? Wenn dies der Fall ist, müssen Sie sowohl A als auch B zur uses Klausel hinzufügen. Sie können dann zwischen den beiden Verfahren unterscheiden, indem Sie A.One.SomeProcedure oder B.One.SomeProcedure schreiben. Wenn Sie nur One.SomeProcedure schreiben, wird das Verfahren in der Einheit letzte in der uses Klausel verwendet. [Hier gehe ich davon aus, dass One Klassen sind, die Klasse VerfahrenSomeProcedure enthalten. Wenn SomeProcedure eine gewöhnliche Prozedur der Klasse One ist, müssen Sie - natürlich - ein Objekt dieser Klasse erstellen und dieses verwenden. Anschließend können Sie tun myobj := A.One.Create oder myobj := B.One.Create, wo var myobj: A.One oder var myobj: B.One jeweils]

(Denken Sie auch daran, dass jede Einheit zweiuses Klauseln enthält. Eine am Anfang des interface Abschnitt und eine am Anfang des implementation Abschnitt . Wenn Sie oben N.)

Beachten Sie auch, dass in Delphi, die Klasse-Aufruf muss auf einer Linie angeordnet sein, etwas von der Einheit A in Zeile N, die uses Klausel, um die Einheit A enthalten sein sollte, ed TOne, mit dem T Präfix. Jeder folgt dieser Konvention und es sieht seltsam ohne es aus.

+0

In Delphi 2007, gibt es mir Kompilierungsfehler, dass A.SomeProcedure und B.SomeProcedure nicht deklarierte Bezeichner sind .. – ashes999

+1

Nun, wenn 'SomeProcedure' ist eine Klassenprozedur von "One", dann müssen Sie 'A.One.SomeProcedure' oder' B.One.SomeProcedure' oder 'One.SomeProcedure' schreiben. –

+0

Awesome. Danke für die Erwähnung von Feinheiten der Verwendung mehrerer Einheiten. – ashes999

2

Wie wäre es mit TNewClassA = Klasse (UnitA.One) und TNewClassB = Klasse (UnitB.One)?

+0

+1, weil ich finde, dass dies eine elegante Lösung ist – Steve

+0

danke, alltho 'sollte man nie in einer Situation sein, in der zwei Typen den gleichen Namen haben ... – ComputerSaysNo

+0

Einverstanden dass dies eine unglückliche Situation ist. Es ist auch nicht in meiner Macht, es zu überarbeiten. C# erledigt dies gut, indem Sie Namesapces vollständig qualifizieren. Auch Delphi - aber Sie müssen immer noch beide Einheiten in "uses" setzen. – ashes999

Verwandte Themen