![]() |
Delphi-Version: XE6
Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit
Hallo,
lt. diversen Programmiervorschlägen (u.a. von Nick Hodges) soll man ja Interfaces und Implementierungen trennen und möglichst auch in verschiedenen Units speichern. Das sieht dann so bei mir so aus:
Code:
und:
unit uInterface;
interface type IFoo = interface ['{BD3EC9DA-3E7A-4839-806E-0DCCA325991C}'] procedure TuWas; end; implementation end.
Code:
unit uDeklaration;
interface implementation uses uInterface; type TFoo = class(TInterfacedObject, IFoo) procedure Tuwas; end; { TFoo } procedure TFoo.Tuwas; begin {... Mach was ...} end; end. Die Registrierung im GlobalContainer hatte ich bisher im Initialization-Abschnitt vorgenommen. Da Stevie aber geschrieben hat (und in den Spring4d-Beispielen auch demonstriert hat): Zitat:
Code:
Da die Klasse TFoo nicht sichtbar ist, tritt hier ein Fehler auf!
unit uRegistration;
interface uses Spring.Container; procedure RegisterTypes(const aContainer: TContainer); implementation uses uDeklaration; procedure RegisterTypes(const aContainer: TContainer); begin aContainer.RegisterType<TFoo>; // <-- hier tritt ein Fehler auf aContainer.Build; end; end. Wenn ich aber die type-Anweisung in den Interface-Abschnitt verschiebe, gibt es keinen Fehler mehr. Meine Frage: Gibt es hier einen Konflikt zwischen 2 verschiedenen Programmierstilen ("Wo soll die type-Anweisung der Klasse stehen" vs. "Auslagerung der RegisterType-Anweisung in eine eigene Unit"), ist meine Annahme, dass die type-Anweisung im Implementation-Teil "versteckt" werden soll, damit die Klasse nicht im Projekt sichtbar ist, übertrieben oder übersehe ich eine Kleinigkeit? Noch eine Frage am Rande: Soll in der RegisterType-Anweisung der Zusatz ".Implements<IFoo>" hinzugefügt werden oder nicht? Wird das Programm dadurch schneller, wenn der Zusatz hinzugefügt ist? Gruß Bernie |
AW: Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit
Zitat:
Wer die Klasse braucht, muss eh die Unit usen und dann soll er sie auch sehen. Wer sie nicht braucht, lässt sie einfach weg. Wie du ja bereits bemerkt hast, funktioniert Stevie's weiser Rat anders auch gar nicht. |
AW: Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit
Zitat:
Delphi-Quellcode:
ist das Explizite registrieren genau dieses Servicetypens T. Implementiert deine an
.Implements<T>
Delphi-Quellcode:
übergebene Klasse nur ein Interface (IInterface wird ignoriert), dann ergibt sich kein Unterschied. Sind dort aber möglicherweise noch andere Interfaces implementiert, dann registriert der Container diese intern implizit auch, wenn für den Typen nicht schon mindestens eine explizite Servicetyp Registrierung vorliegt.
RegisterType
|
AW: Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit
Danke,
die Antworten haben mir geholfen und vor allem klar gestellt, was in diesem Falle ein guter Programmierstil ist. Gruß Bernie |
AW: Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit
Und das wäre? Typdefinition nun doch in interface-Abschnitt?
Zitat:
Bei uns wird differenziert. Das folgende gilt nur für Klassen die von "außen" verwendet werden:
Im Übrigen finde ich es super dass Du dich damit beschäftigst. :thumb: In der .NET Welt ist das schon länger üblich. Wir haben das schon seit über 6 Jahren. Bei den Delphianer verbreitet sich das nur zögerlich. |
AW: Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit
Wenn eine Klasse nur über das Interface verwendet werden soll, dann erstellt man diese so, dass es nur Sinn macht wenn man das Interface verwendet.
Delphi-Quellcode:
Oder man erstellt eine Klasse, die sich wie eine normale Klassen-Instanz und wie eine Interface-Instanz verhält, was allerdings etwas mehr Tipparbeit bedeutet.
IFoo = interface
procedure Bar; end; TFoo = class( TInterfacedObject, IFoo ) protected procedure Bar; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz