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 einer Methode erhöhen? (https://www.delphipraxis.net/149137-sichtbarkeit-einer-methode-erhoehen.html)

himitsu 15. Mär 2010 10:54


Sichtbarkeit einer Methode erhöhen?
 
Joar, also bei den Property kann man doch recht einfach die Sichtbarkeit nachträglich herhöhen.
Delphi-Quellcode:
type
  THiddenClass = class
  protected
    property Irgendwas: Integer read GetWas write SetWas;
  end;

  TVisibleClass = class(THiddenClass)
  public
    property Irgendwas;
  end;
Warum kann man das aber nicht mit den Methoden machen
oder hab ich nur noch nicht rausbekommen, wie sowas geht?

Gut, möglich wäre ja die gewünschte Methode zu überschreiben (verdecken) und dann via inherited die versteckte Methode aufzurufen, aber so sonderlich elegant ist das nicht unbedingt.

Panthrax 15. Mär 2010 11:05

Re: Sichtbarkeit einer Methode erhöhen?
 
Ich verstehe die Frage nicht. Funktioniert doch genau so, man muss sie allerdings überschreiben.

DeddyH 15. Mär 2010 11:07

Re: Sichtbarkeit einer Methode erhöhen?
 
Nein. Zugegeben, ich musste das auch erst 2 mal lesen. Es geht ihm darum, die Methode in der geerbten Klasse nicht neu implementieren zu müssen, sondern einfach wie bei Properties nach public schieben und gut.

himitsu 15. Mär 2010 11:28

Re: Sichtbarkeit einer Methode erhöhen?
 
@DeddyH: Genau.

Delphi-Quellcode:
type
  THiddenClass = class
  protected
    procedure Irgendwas;
  end;

  TVisibleClass = class(THiddenClass)
  public
    procedure Irgendwas; // hier muß man ja die Methode nochmal implementieren,
  end;                   // auch wenn man sie NUR verschieben möchte

HERMES 15. Mär 2010 11:35

Re: Sichtbarkeit einer Methode erhöhen?
 
Delphi-Quellcode:
type
  THiddenClass = class
  protected
    procedure Irgendwas; virtual;
  end;

  TVisibleClass = class(THiddenClass)
  public
    procedure Irgendwas; override;// hier muß man ja die Methode nochmal implementieren,
  end;                   // auch wenn man sie NUR verschieben möchte


implementation

procedure TVisibleClass.Irgendwas;
begin
   inherited Irgendwas;
end;

uligerhardt 15. Mär 2010 11:36

Re: Sichtbarkeit einer Methode erhöhen?
 
Zitat:

Zitat von himitsu
@DeddyH: Genau.

Delphi-Quellcode:
type
  THiddenClass = class
  protected
    procedure Irgendwas;
  end;

  TVisibleClass = class(THiddenClass)
  public
    procedure Irgendwas; // hier muß man ja die Methode nochmal implementieren,
  end;                   // auch wenn man sie NUR verschieben möchte

Das wäre jetzt auch die einzige Lösung, die mir einfällt. Das hier kannst du ja trotzdem benutzen (WIMRE - soll heißen: ungetestet :mrgreen: ):

Zitat:

Zitat von HERMES
Delphi-Quellcode:
procedure TVisibleClass.Irgendwas;
begin
   inherited Irgendwas;
end;

Du kannst die "überladene" Routine noch als inline deklarieren. Dann hast du zumindest keine/geringere Laufzeiteinbußen.

himitsu 15. Mär 2010 11:42

Re: Sichtbarkeit einer Methode erhöhen?
 
@HERMES: so würde man die Methode überschreiben, aber das will ich ja nicht.

Im Ergebnis (TVisibleClass) soll die Methode (aus THiddenClass) einfach nur sichtbar werden, so als wäre sie in Public deklariert wurden, obwohl sie in THiddenClass ja versteckt (protected) ist.

Stevie 15. Mär 2010 11:49

Re: Sichtbarkeit einer Methode erhöhen?
 
Du bräuchtest quasi sowas:
Delphi-Quellcode:
type
  THiddenClass = class
  protected
    procedure Irgendwas; virtual;
  end;

  TVisibleClass = class(THiddenClass)
  public
    procedure Irgendwas; inherited;
  end;
Das gibt Delphi nicht her - wär aber ein nettes Enhancement.
Hätte aber imho keinen wirklichen Nutzen, sondern unterstützt nur die Faulheit eines Programmierers in einigen wenigen Fällen.

himitsu 15. Mär 2010 12:09

Re: Sichtbarkeit einer Methode erhöhen?
 
Zitat:

Zitat von Stevie
Das gibt Delphi nicht her - wär aber ein nettes Enhancement.
Hätte aber imho keinen wirklichen Nutzen, sondern unterstützt nur die Faulheit eines Programmierers in einigen wenigen Fällen.

Wieso Faulheit?

So könnte man eine Grundklasse erstellen und braucht dann nur, je nach Nutzen, die nötigen Funktionen freischalten.

Also genauso, wie es bei den TCustom...-Klassen der VCL auch gemacht wird.
Leider funktioniert dieses aber nur mit Properties, aber eine Klasse besteht eben auch noch aus Methoden.

Das virtual ist nicht nöig, aber so wäre es schon irgendwie OK.
Delphi-Quellcode:
type
  THiddenClass = class
  protected
    procedure Irgendwas;
  end;

  TVisibleClass = class(THiddenClass)
  public
    procedure Irgendwas; inherited;
  end;

procedure THiddenClass.Irgendwas;
begin
end;

Stevie 15. Mär 2010 12:17

Re: Sichtbarkeit einer Methode erhöhen?
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Stevie
Das gibt Delphi nicht her - wär aber ein nettes Enhancement.
Hätte aber imho keinen wirklichen Nutzen, sondern unterstützt nur die Faulheit eines Programmierers in einigen wenigen Fällen.

Wieso Faulheit?

So könnte man eine Grundklasse erstellen und braucht dann nur, je nach Nutzen, die nötigen Funktionen freischalten.

Kann man doch, sind nur einige Zeilen Code mehr zu schreiben.

DeddyH 15. Mär 2010 12:22

Re: Sichtbarkeit einer Methode erhöhen?
 
Jepp, aber es sieht schon blöd aus, wenn man zig Methoden implementiert, die nur inherited aufrufen :mrgreen:

Stevie 15. Mär 2010 12:29

Re: Sichtbarkeit einer Methode erhöhen?
 
Mir würde sich in diesem Zusammenhang sowieso die Frage stellen, ob es sinnvoll ist, sowas zu machen, denn entweder macht die Methode etwas internes, dann gebe ich sie nicht nach außen frei, oder sie macht etwas, was man von außen aufrufen können soll, dann wäre es unsinnig, sie protected zu deklarieren. Wäre es von beidem etwas, würden sich 2 unterschiedliche Methoden anbieten. Die, die nach außen sichtbar ist, welche eine nur intern sichtbare Methode aufruft.
Aber ich bin mir sicher, es gibt Fälle, wo es elegant wäre, wenn man das so wie oben angedacht machen könnte.

himitsu 15. Mär 2010 12:30

Re: Sichtbarkeit einer Methode erhöhen?
 
Zitat:

Zitat von Stevie
Kann man doch, sind nur einige Zeilen Code mehr zu schreiben.

Aber dann ist und bleibt es aber bei einer NEUDeklaration und nicht NUR um die Sichtbarkeit.

Es geht um eine bessere Codeverständlichkeit.

Bei property name; weiß man sofort, daß es sich nur um eine Sichtbarkeitsänderung handelt.

Wenn man das jetzt so macht, dann erkennt man aus der Deklaration nicht, daß hier nur die Sichtbarkeit geändert wird ... immerhin könnte in dem Code, da ganz weit unten, noch was anderes stehen, außer dem Inherited-Aufruf.

Und dann auch noch das:
Zitat:

Zitat von DeddyH
Jepp, aber es sieht schon blöd aus, wenn man zig Methoden implementiert, die nur inherited aufrufen :mrgreen:


[add]
Zitat:

Zitat von Stevie
Mir würde sich in diesem Zusammenhang sowieso die Frage stellen, ...

Dann könnte man auch die ganzen Common-Klassen der VCL weglassen, denn
Zitat:

denn entweder macht das Property etwas internes, dann gebe ich es nicht nach außen frei, oder es macht etwas, was man von außen aufrufen können soll, dann wäre es unsinnig, es protected zu deklarieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 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