Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus (https://www.delphipraxis.net/174171-sichtbarkeit-von-typen-z-b-klassen-aus-der-unit-heraus.html)

Der schöne Günther 8. Apr 2013 12:35

Delphi-Version: XE2

Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Ja, das sind Fragen die man besser nicht in der Öffentlichkeit stellt. Aber hier sind wir ja ... unter uns 8-)


Delphi hat mich schon mehrmals mit seiner Interpretation von Sichtbarkeitsmodifikatoren verwundert. Jetzt frage ich mich, wie ich eigentlich verhindern kann, eine Klasse aus einer Unit nach außen zu führen. Die Deklaration der Klasse steht ja direkt im
Delphi-Quellcode:
interface
-Teil der Unit. Mir fällt nichts ein, wo ich da noch sagen könnte: "Diese Klasse soll in dieser Unit sichtbar sein, wer aber von außen kommt und diese Unit einbindet - Den geht das nichts an".

Konkretes Beispiel wäre einfach nur eine Klasse A, die ein paar unterstützende Methoden (beispielsweise [De]kodierung) für Klasse B anbietet. Wenn man die Unit einbindet, interessiert einen nur Klasse B.

Mir fällt nur ein, Klasse B zu einer
Delphi-Quellcode:
private
oder
Delphi-Quellcode:
protected
inneren Klasse zu machen. Aber das ist hässlich.

Sir Rufo 8. Apr 2013 12:42

AW: Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Deklariere die Klasse im implementation Teil ;)

Klingt einfach, ist es auch :mrgreen:

Der schöne Günther 8. Apr 2013 12:49

AW: Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Das macht Sinn, vielen Dank :thumb:

Aber:

Gewünscht hätte ich mir, natürlich auch eine private Referenz als Member in der Klasse halten zu können (von außen sieht die ja eh niemand), siehe Beispiel:

Delphi-Quellcode:
interface
type

    wichtigeKlasse = class
      private privateReferenz: unwichtigeKlasse; // Kennt er nicht
      [...]
   end;

implementation
[...]
type unwichtigeKlasse = class
[...]
end;
In Methoden kann ich dann meine unwichtigeKlasse verwenden, aber wenn ich über die Aufrufe hinweg die Referenz behalten will muss sie wohl im interface-Teil deklariert werden und ist somit überall sichtbar...

sx2008 8. Apr 2013 12:52

AW: Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1210559)
Konkretes Beispiel wäre einfach nur eine Klasse A, die ein paar unterstützende Methoden (beispielsweise [De]kodierung) für Klasse B anbietet. Wenn man die Unit einbindet, interessiert einen nur Klasse B.

Wenn du aber die Klasse A testen möchtest, dann brauchst du auch Zugriff auf sie.
Diese Klasse für [De]kodierung ist prädistiniert dafür, dass man sie testet.
Delphi-Quellcode:
// Test (ohne Testframework)
const
  TESTDATA = 'teststring123äöüß';
var
  a : TKlasseA;
  s : String;
begin
  a := TKlasseA.Create;
  s := a.Encode(TESTDATA);
  s := a.Decode(s);
  if s <> TESTDATA then
    raise Exception.Create('Test TKlasseA fehlgeschlagen');
Wie man sieht ist es gar nicht so schlimm, dass man in Delphi nicht gezielt Klassen verstecken kann weil man die Klassen sowieso testen muss.

Der schöne Günther 8. Apr 2013 12:58

AW: Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Zitat:

Zitat von sx2008 (Beitrag 1210568)
Wie man sieht ist es gar nicht so schlimm

Das glaube ich auch langsam, es gibt sicher schlimmeres :wink:

DeddyH 8. Apr 2013 13:42

AW: Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Mit ein wenig Aufwand (Typecasting) geht aber auch das Angestrebte:
Delphi-Quellcode:
interface
type

    wichtigeKlasse = class
      private privateReferenz: TObject; //oder die Basisklasse von unwichtigeKlasse
      [...]
   end;

implementation
[...]
type unwichtigeKlasse = class
[...]
end;

procedure wichtigeKlasse.MachWas;
var
  uk: unwichtigeKlasse;
begin
  uk := privateReferenz as unwichtigeKlasse;
  ...
end;

Der schöne Günther 8. Apr 2013 13:50

AW: Sichtbarkeit von Typen (z.B. Klassen) aus der Unit heraus
 
Gute Idee. In dem Fall wäre das wirklich denkbar. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz