Namespaces in Delphi 8
Zuerst möchte ich noch einmal darauf eingehen, wie Delphi 8 mit Namespaces umgegangen ist. Hierzu möchte ich zwei einfache Source-Dateien nutzen:
Delphi-Quellcode:
unit Sample.Controls.Base;
interface
type
TControl =
class
end;
implementation
end.
Delphi-Quellcode:
unit Sample.Controls.Listview;
interface
type
TListview =
class(TControl)
end;
type
TItem =
class
end;
implementation
end.
Wen man diese Dateien in Delphi 8 in ein
Package kompiliert und sich das Ergebnis mit Hilfe eines
Reflektor-Tools betrachtet, so stellt man fest, dass das
Package zwei Namespaces enthält:
Sample.Controls.Base und
Sample.Controls.Listview.
Öffnet man jetzt den Namespace
Sample.Controls.Base, so sieht man, dass dieser zwei Klassen enthält. Die eine ist unsere
TControl Klasse, die andere heißt
Unit. Diese zweite, spezielle Klasse enthält den Initialisierungs- und Finalisierungscode der
Sample.Controls.Base Unit, sowie alle Funktionen und Prozeduren, welche auf
Unit-Level deklariert/implementiert wurden. Entsprechend sind im Namespace
Sample.Controls.Listview die Klassen
TListview und
TItem sowie die spezielle Klasse
Unit enthalten.
Wen man jetzt weitere Units dem
Package hinzufügt, so wird man feststellen, dass jede
Unit ihren eigenen, eindeutigen Namespace mit allen Klassen sowie der Klasse
Unit dem
Package hinzufügt.
So, wo ist jetzt das Problem?
Units sind viel einfacher zu benutzen und zu verwalten wenn diese jeweils nur wenige Klassen enthalten. Wie dem auch sei, erstellt man Libraries/Packages mit vielen Units, so sind in den Assemblies entsprechend viele Namespaces enthalten. Das stört uns als Delphientwickler nicht weiter, da der Compiler sich um diese interna sorgt. Allerdings ist dieser Mechanismus für Entwickler, welche andere .NET Sprachen nutzen, sehr umständlich. C# Programmierer müssen so z.B. jeden Namespaces separat importieren was deren Code nur unnötig aufbläht. Auch hat es den Nachteil, dass Delphi.NET Assemblies für Programmierer anderer .NET Sprachen schwerer zu verstehen sind. Wollen/müssen diese den vollständigen Typennamen nutzen, so müssen sie jedes Mal etwas wie das folgende tippen:
Sample*.Con*trols*.Base*.TControl oder
Sample.Con*trols.Listview.TListview.