Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klasse um eine funktion erweitern - Vererbung (https://www.delphipraxis.net/53676-klasse-um-eine-funktion-erweitern-vererbung.html)

mumu 21. Sep 2005 11:15


Klasse um eine funktion erweitern - Vererbung
 
Hallo leute!

ich möchte die Klasse TJvZlibMultiple so erweitern, damit ich während des packvorgangs auch abbrechen kann. in der Function AddFile müsste ich da eine überprüfung einbauen, ob eine variable isBreakPressed auf true ist, um dann das packen abzubrechen.

wie muss ich da vorgehen?
hier ein ausschnitt der ursprünglichen klasse

Delphi-Quellcode:
TJvZlibMultiple = class(TJvComponent)
  private
    ...
  protected
    procedure AddFile(FileName, Directory, FilePath: string; DestStream: TStream);
    procedure DoProgress(Position, Total: Integer); virtual;
  public
    constructor Create(AOwner: TComponent); override;

    function CompressFiles(Files: TStrings): TStream; overload;
    ...
  published
    ...
  end;
und hier meine vererbte
Delphi-Quellcode:
type
  TJvZlibMultipleWithBreak = class(TJvZlibMultiple)
    private
      isBreakPressed: boolean;
    public
      constructor Create(AOwner: TComponent); override;
    protected
      procedure AddFile(FileName, Directory, FilePath: string; DestStream: TStream); override;
    end;
bei AddFile beschwert er sich: "Eine statische Methode kann nicht überschrieben werden"
was mach ich falsch, bzw. besser gesagt bin ich da aufn richtigen weg, oder wie geh ich das an?

danke schonmal

Grishnak 21. Sep 2005 11:22

Re: Klasse um eine funktion erweitern - Vererbung
 
"override" kannst du nur benutzten, wenn es sich um eine virtuelle Methode handelt!

Wenn du "override" weglässt, wird die Methode komplett überschrieben; du kannst aber immer noch per "inherited" auf die ursprüngliche Methode zurückgreifen!

Delphi-Quellcode:
TJvZlibMultipleWithBreak.AddFile(FileName, Directory, FilePath: string; DestStream: TStream);
begin
  [..eigener Code..]

  inherited; // <-- Aufruf der ursprünglichen Methode

  [..eigender Code..]
end;

mumu 21. Sep 2005 11:27

Re: Klasse um eine funktion erweitern - Vererbung
 
jo hab ich mir schon auch gedacht, aber ich möchte ja eher wissen, wie ich das problem sonst angehen kann?

Grishnak 21. Sep 2005 11:28

Re: Klasse um eine funktion erweitern - Vererbung
 
Oops, zu langsam editiert :| ! Schau dir mein obiges Posting nochmal an!

Kedariodakon 21. Sep 2005 11:35

Re: Klasse um eine funktion erweitern - Vererbung
 
Delphi-Referenz durchsuchenReintroduce
Delphi-Referenz durchsuchenVirtual
Delphi-Referenz durchsuchenAbstract
Delphi-Referenz durchsuchenOverride
Delphi-Referenz durchsuchenInherited

:zwinker:

Bei einem der vielen wirst du fündig...

Und das könnte auch helfen:
Virtual und Override

Oder einfach mal im Forum suchen...


Bye

shmia 21. Sep 2005 12:12

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von mumu
ich möchte die Klasse TJvZlibMultiple so erweitern, damit ich während des packvorgangs auch abbrechen kann.

Scheint ja eine sinnvolle Erweiterung zu sein.
Du solltest dein Anliegen als neues Feature auf
http://homepages.borland.com/jedi/is.../main_page.php
vortragen.
Am Besten gleich dazuschreiben, wie TJvZlibMultiple erweitert werden muss.
Dann musst du keine neue Klasse ableiten; was sowieso nicht funktioniert, da es vom Design her nicht vorgesehen war.

tigerman33 21. Sep 2005 12:36

Re: Klasse um eine funktion erweitern - Vererbung
 
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse! Untested, aber so könnte es gehen:

Delphi-Quellcode:
type
  TJvZlibMultipleWithBreak = class(TJvZlibMultiple)
    private
      FBreakPressed: boolean;
    protected
      procedure AddFile(FileName, Directory, FilePath: string; DestStream: TStream); virtual;
    public
      constructor Create(AOwner: TComponent); override;
      property BreakPressed: boolean read FBreakPressed write FBreakPressed;
    end;

constructor TJvZlibMultipleWithBreak.Create(AOwner: TComponent);
begin
  inherited;
  FBreakPressed := false;
end;

procedure TJvZlibMultipleWithBreak.AddFile(FileName, Directory, FilePath: string; DestStream: TStream);
begin
  if not BreakPressed then
    inherited;
end;

shmia 21. Sep 2005 13:30

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von tigerman33
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse!

Weil niemand die procedure TJvZlibMultipleWithBreak.AddFile aufruft.
Die procedure TJvZlibMultiple.AddFile müsste virtuell sein, damit die Prozedur aufgerufen wird.

Die Klasse TJvZlibMultiple ruft ja aus CompressFiles die procedure AddFile auf.
Dass es in einer abgeleiteten Klasse eine geänderte Procedure AddFiles gibt, das "weiss"
TJvZlibMultiple.CompressFiles nicht.

GuenterS 21. Sep 2005 14:03

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von shmia
Zitat:

Zitat von tigerman33
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse!

Weil niemand die procedure TJvZlibMultipleWithBreak.AddFile aufruft.
Die procedure TJvZlibMultiple.AddFile müsste virtuell sein, damit die Prozedur aufgerufen wird.

Die Klasse TJvZlibMultiple ruft ja aus CompressFiles die procedure AddFile auf.
Dass es in einer abgeleiteten Klasse eine geänderte Procedure AddFiles gibt, das "weiss"
TJvZlibMultiple.CompressFiles nicht.

Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann. Man kann sie danach trotzdem noch in der überschriebenen Methode über inherited oder sonstwo in der abgeleiteten Klasse über inherited Methodenname aufrufen.

Man muss eine Methode nur dann als virtual oder dynamic deklarieren, wenn man sie mittels override überschreiben möchte.

Grishnak 21. Sep 2005 14:25

Re: Klasse um eine funktion erweitern - Vererbung
 
Was shmia uns sagen will, ist, dass andere Methoden von TJvZlibMultiple die intern "Add" aufrufen, eben von dieser "neuen" Add-Methode nichts wissen (können!) und deshalb immer die ursprüngliche Add-Methode aufrufen werden!

Khabarakh 21. Sep 2005 14:26

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von GuenterS
Zitat:

Zitat von shmia
Zitat:

Zitat von tigerman33
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse!

Weil niemand die procedure TJvZlibMultipleWithBreak.AddFile aufruft.
Die procedure TJvZlibMultiple.AddFile müsste virtuell sein, damit die Prozedur aufgerufen wird.

Die Klasse TJvZlibMultiple ruft ja aus CompressFiles die procedure AddFile auf.
Dass es in einer abgeleiteten Klasse eine geänderte Procedure AddFiles gibt, das "weiss"
TJvZlibMultiple.CompressFiles nicht.

Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.

Falsch, die Methode der Basisklasse wird dann nur überdeckt. Bei einem Typecast oder - wie shmia schon gesagt hat - einem Aufruf über eine andere Methode der Basisklasse wird im Gegensatz zu virtual - override immer noch die verdeckte Methode aufgerufen.
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TBase = class
  public
    procedure Foo;
    procedure Bar;
  end;

  TDescendant = class(TBase)
  public
    procedure Bar;
  end;

{ TDescendant }

procedure TDescendant.Bar;
begin
  Writeln('TDescendant.Bar');
end;

{ TBase }

procedure TBase.Bar;
begin
  Writeln('TBase.Bar');
end;

procedure TBase.Foo;
begin
  Bar;
end;

var
  Descendant: TDescendant;
begin
  Descendant := TDescendant.Create;
  Descendant.Foo;
  TBase(Descendant).Bar;

  Descendant.Free;

  Readln;
end.
Konsolenausgabe
TBase.Bar
TBase.Bar

GuenterS 21. Sep 2005 14:35

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von GuenterS
Zitat:

Zitat von shmia
Zitat:

Zitat von tigerman33
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse!

Weil niemand die procedure TJvZlibMultipleWithBreak.AddFile aufruft.
Die procedure TJvZlibMultiple.AddFile müsste virtuell sein, damit die Prozedur aufgerufen wird.

Die Klasse TJvZlibMultiple ruft ja aus CompressFiles die procedure AddFile auf.
Dass es in einer abgeleiteten Klasse eine geänderte Procedure AddFiles gibt, das "weiss"
TJvZlibMultiple.CompressFiles nicht.

Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.

Falsch, die Methode der Basisklasse wird dann nur überdeckt. Bei einem Typecast oder - wie shmia schon gesagt hat - einem Aufruf über eine andere Methode der Basisklasse wird im Gegensatz zu virtual - override immer noch die verdeckte Methode aufgerufen.
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TBase = class
  public
    procedure Foo;
    procedure Bar;
  end;

  TDescendant = class(TBase)
  public
    procedure Bar;
  end;

{ TDescendant }

procedure TDescendant.Bar;
begin
  Writeln('TDescendant.Bar');
end;

{ TBase }

procedure TBase.Bar;
begin
  Writeln('TBase.Bar');
end;

procedure TBase.Foo;
begin
  Bar;
end;

var
  Descendant: TDescendant;
begin
  Descendant := TDescendant.Create;
  Descendant.Foo;
  TBase(Descendant).Bar;

  Descendant.Free;

  Readln;
end.
Konsolenausgabe
TBase.Bar
TBase.Bar

Du hast anscheinend nicht verstanden was ich geschrieben habe. Das was Du in Deinem Beispiel zeigen wolltest, war klar. Es ging allerdings nicht darum.

Delphi-Quellcode:
   type
      TBase = class
         protected
           procedure myMethod;
      end;
      TExtended = class(TBase)
         protected
           procedure MyMethod;
      end;

implementation

  ...

  procedure TExtended.MyMethod;
  begin
    inherited;  //<---- Hier wird die Methode von TBase aufgerufen
  end;


  ....

end.

[Edit]
*grml* Habe schmia Beitrag wohl falsch gelesen, dachte sie/er meinte, dass man nur Methoden vererben kann, wenn man in der Mutterklasse virtual hinschreibt.

Zusatz: Wenn Du meinen ganzen Beitrag zitiert hättest wäre das auch klar gewesen, dass ich was anderes meinte, man sollte/darf halt nicht immer nur die Teile zitieren die man für seine Aussagen braucht.
[/Edit]

Khabarakh 21. Sep 2005 15:09

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von GuenterS
Du hast anscheinend nicht verstanden was ich geschrieben habe. Das was Du in Deinem Beispiel zeigen wolltest, war klar. Es ging allerdings nicht darum.

Doch, genau darum ging es :wink: .
Zitat:

[Edit]
*grml* Habe schmia Beitrag wohl falsch gelesen, dachte sie/er meinte, dass man nur Methoden vererben kann, wenn man in der Mutterklasse virtual hinschreibt.

Zusatz: Wenn Du meinen ganzen Beitrag zitiert hättest wäre das auch klar gewesen, dass ich was anderes meinte, man sollte/darf halt nicht immer nur die Teile zitieren die man für seine Aussagen braucht.
[/Edit]
Auch mit dem Rest liest sich dein Post eindeutig so, dass du shmia widersprechen wolltest. Ich wollte das nur klar stellen.

GuenterS 21. Sep 2005 15:18

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von Khabarakh
Zitat:

[Edit]
*grml* Habe schmia Beitrag wohl falsch gelesen, dachte sie/er meinte, dass man nur Methoden vererben kann, wenn man in der Mutterklasse virtual hinschreibt.

Zusatz: Wenn Du meinen ganzen Beitrag zitiert hättest wäre das auch klar gewesen, dass ich was anderes meinte, man sollte/darf halt nicht immer nur die Teile zitieren die man für seine Aussagen braucht.
[/Edit]
Auch mit dem Rest liest sich dein Post eindeutig so, dass du shmia widersprechen wolltest. Ich wollte das nur klar stellen.

Wenn man den Rest des Ausgangspostings mitliest wird man erkennen, dass dem nicht so ist.


Ich habe dort geschrieben:
Zitat:

Zitat von GuenterS
Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann. Man kann sie danach trotzdem noch in der überschriebenen Methode über inherited oder sonstwo in der abgeleiteten Klasse über inherited Methodenname aufrufen.

Man muss eine Methode nur dann als virtual oder dynamic deklarieren, wenn man sie mittels override überschreiben möchte.

Damit habe ich lediglich behauptet, man die Ursprungsmethode innerhalb der überschriebenen diese mittels inherited aufrufen kann.

Wenn man meine beiden Sätze in zusammenhang liest (deshalb stehen sie wohl auch nebeneinander :gruebel: ), relativiert sich wieder der Anschein, dass ich shmia widerspreche. Allerdings nur deshalb weil sie/er und ich von ganz verschiedenen Dingen reden.

Grishnak 21. Sep 2005 15:24

Re: Klasse um eine funktion erweitern - Vererbung
 
Die Eloquenz mancher User in diesem Forum verblüfft mich immer wieder... :tongue:

Khabarakh 21. Sep 2005 16:04

Re: Klasse um eine funktion erweitern - Vererbung
 
shmia schrieb, dass die Methode der abgeleiteten Klasse die virtuelle Methode der Basisklasse überschreiben muss, um überhaupt aufgerufen zu werden.
Zitat:

Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.
Das klingt doch so, als ob sie auch so überschrieben wird, also in CompressFiles die überschreibende Methode aufgerufen wird. Auch danach schreibst du von überschriebenen Methoden ohne virtual, die eben nur verdeckt sind. Daraus kann man IMO schon einen gewissen Widerspruch lesen.

Aber lassen wir das, war ja nur ein Missverständnis :cheers: .

GuenterS 21. Sep 2005 16:09

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von Khabarakh
shmia schrieb, dass die Methode der abgeleiteten Klasse die virtuelle Methode der Basisklasse überschreiben muss, um überhaupt aufgerufen zu werden.
Zitat:

Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.
Das klingt doch so, als ob sie auch so überschrieben wird, also in CompressFiles die überschreibende Methode aufgerufen wird. Auch danach schreibst du von überschriebenen Methoden ohne virtual, die eben nur verdeckt sind. Daraus kann man IMO schon einen gewissen Widerspruch lesen.

Aber lassen wir das, war ja nur ein Missverständnis :cheers: .

Gut lassen wir es dabei bewenden, nachdem ich noch angemerkt habe, dass man bitte vollständig zitiere, da es sonst leicht wie gesehen zu Sinnverzerrungen kommen kann.

Hador 21. Sep 2005 16:09

Re: Klasse um eine funktion erweitern - Vererbung
 
Och Leute is doch egal !!!

Wie Kedariodakon oben schon gepostet hat:
lies einfach mal diese Beiträge KLICK
Da wurd das super erklärt.

DevilsCamp 21. Sep 2005 16:19

Re: Klasse um eine funktion erweitern - Vererbung
 
Back to Topic

Da es sich ja um eine Jedi-Klasse handelt, wieso änderst du die Klasse nicht direkt anstatt eine neue Klasse davon abzuleiten?

GuenterS 21. Sep 2005 16:24

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von DevilsCamp
Back to Topic

Da es sich ja um eine Jedi-Klasse handelt, wieso änderst du die Klasse nicht direkt anstatt eine neue Klasse davon abzuleiten?

Vielleicht will er/sie ja nicht das Verhalten aller seiner/ihrer jetztigen/zukünftigen Programme ändern, in dem er die Jedi Klasse ändert sondern nur gezielt ein einziges?

bzw. Wenn eine neue Version von den jedis rauskommt, könnte sie ihre Änderung nochmal machen.

DevilsCamp 21. Sep 2005 16:25

Re: Klasse um eine funktion erweitern - Vererbung
 
Dann sollte dies gleichzeitig als Änderungsvorschlag an die Entwickler gesendet werden ;)

GuenterS 21. Sep 2005 16:29

Re: Klasse um eine funktion erweitern - Vererbung
 
Zitat:

Zitat von DevilsCamp
Dann sollte dies gleichzeitig als Änderungsvorschlag an die Entwickler gesendet werden ;)

Ja sollte, trotzdem könnte es sein, dass diese Änderung nicht angenommen wird. Wobei ich bei diese jetzt nicht auf die Änderung des Threaderstellers ziele, sondern es allgemein meine.

leddl 21. Sep 2005 16:34

Re: Klasse um eine funktion erweitern - Vererbung
 
Um mich da jetzt auch mal einzumischen, wo ist denn das Problem, wenn er diese kleine Änderung bei seiner Version dieser Komponente einbaut? :gruebel: Es ist doch nicht so, als würde dadurch das Verhalten unglaublich verändert... Er muß eben nur diese zusätzliche Eigenschaft im Konstruktor der Komponente mit false initialisieren, dann ändert sich bei Projekten, bei denen er diesen Wert nicht nutzt Nullkommagarnüscht. :roll:

GuenterS 21. Sep 2005 17:23

Re: Klasse um eine funktion erweitern - Vererbung
 
Bei dieser einen Änderung wird er wohl keine Probleme bekommen, außer dass er sie vielleicht bei jedem update der JEDIs wiederholen darf.

Wenn man aber generell jede kleine Änderung, mal hier en bissi, dort ein bissi, ändert, wird man irgendwann eine Version haben die man gar nicht mehr so leicht updaten kann. Da sich durch das Update ja auch der Ursprungscode ändern wird (hoffentlich denn sonst wars update umsonst).

tigerman33 24. Sep 2005 10:31

Re: Klasse um eine funktion erweitern - Vererbung
 
Darf ich mal zum Thema "funktioniert ja nicht wegen virtual" anmerken, dass ich die Methode doch schon als virtual deklariert hatte? Damit wird, auch beim internen Aufruf der Methode, nämlich sehr wohl die überschriebene Methode aufgerufen.

GuenterS 24. Sep 2005 11:28

Re: Klasse um eine funktion erweitern - Vererbung
 
Intern im Sinne innerhalb einer Methode der abgeleiteten Klasse?

Wenn dem so ist solltest du inherited davor schreiben.

tigerman33 26. Sep 2005 09:08

Re: Klasse um eine funktion erweitern - Vererbung
 
Nein, intern im Sinne von Aufruf innerhalb einer geerbten Methode der abgeleiteten Klasse. inherited bringt da nichts, es geht ja darum, die überschriebene Methode in die VMT einzutragen. :???:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz