AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klasse um eine funktion erweitern - Vererbung
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse um eine funktion erweitern - Vererbung

Ein Thema von mumu · begonnen am 21. Sep 2005 · letzter Beitrag vom 26. Sep 2005
Antwort Antwort
Seite 1 von 3  1 23      
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 11:15
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
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#2

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 11:22
"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;
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 11:27
jo hab ich mir schon auch gedacht, aber ich möchte ja eher wissen, wie ich das problem sonst angehen kann?
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#4

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 11:28
Oops, zu langsam editiert ! Schau dir mein obiges Posting nochmal an!
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 11:35
Delphi-Referenz durchsuchenReintroduce
Delphi-Referenz durchsuchenVirtual
Delphi-Referenz durchsuchenAbstract
Delphi-Referenz durchsuchenOverride
Delphi-Referenz durchsuchenInherited



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

Und das könnte auch helfen:
Virtual und Override

Oder einfach mal im Forum suchen...


Bye
Christian
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 12:12
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.
Andreas
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 12:36
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;
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 13:30
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 14:03
Zitat von shmia:
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.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#10

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 14:25
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!
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 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