AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Teil einer Klasse in einer abgeleiteten Klasse umdefinieren
Thema durchsuchen
Ansicht
Themen-Optionen

Teil einer Klasse in einer abgeleiteten Klasse umdefinieren

Ein Thema von changlee · begonnen am 17. Okt 2008 · letzter Beitrag vom 18. Okt 2008
Antwort Antwort
changlee
(Gast)

n/a Beiträge
 
#1

Teil einer Klasse in einer abgeleiteten Klasse umdefinieren

  Alt 17. Okt 2008, 19:40
Hallo,

ich habe schon wieder eine Frage. Ich hoffe hiernach kann ich mal längere Zeit problemlos weitermachen.

Also ich möchte eine Klasse definieren:

Delphi-Quellcode:
TList = class
  private
    fFilename : AnsiString;
    fLength : integer;
    fItems : array of TMsgDataSet;
    fLocked : boolean;
  public
    property Filename : string read fFilename write fFilename;
    property Length : integer read fLength write fLength;
    property Locked : boolean read fLocked;
    procedure Add(MsgNr:integer; Msg:TIdMessage; MsgSize:cardinal);
    procedure Delete(MsgNr:integer);
    procedure LoadFromHd; virtual;
    procedure SaveToHd; virtual;
    procedure Lock;
    procedure Unlock;
  end;
Diese Klasse möchte ich aber nie direkt benutzen, sondern ich werde weitere Klassen von dieser Ableiten, die bis auf die Methoden "LoadFromHD" und "SafeToHD" sowie den Typ von fItems identisch sind. Die Methoden, die überall gleich sind, möchte ich in der Hauptklasse definieren, z.B. "Delete()". Delete muss auf fItems zugreifen, deshalb muss ich fItems auch in der Hauptklasse definieren. fItems ist immer ein dynamisches Array, aber nicht immer vom Typ TMsgDataSet. Der genaue Typ wird erst in einer abgeleiteten Klasse definiert.

Wie kann ich denn das realisieren?

Viele Grüße
Stefan.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Teil einer Klasse in einer abgeleiteten Klasse umdefinie

  Alt 17. Okt 2008, 19:44
Du musst für den Item-Typ (der ja anscheinend auch eine Klasse ist) am besten auch so etwas machen: Eine Basisklasse, von der abgeleitet wird. (Kannst auch TObject nehmen)

Oder aber über Interfaces

In D2009 gibt es glaube ich Generics, damit geht das auch.
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#3

Re: Teil einer Klasse in einer abgeleiteten Klasse umdefinie

  Alt 17. Okt 2008, 20:06
Hallo jfheins,

mit "Interfaces" kann ich leider gar nichts anfangen. Eine kurze suche hier im Forum hat mich auch erstmal nicht weitergebracht.

Im Moment handelt es sich beim Typ von fItems um records. Wenn ich Klassen dafür verwende, kann ich in der Basisklasse TList einfach die Basisklasse von TItems angeben und in den von TList abgeleiteten Klassen setze ich dann die con TItems abgeleiteten Klassen ein. Richtig?
Ich vermute in dem Fall müsste ich bei TList einen constructor und destructor mit inherited definieren und das erzeugen/vernichten der TItem-Instanz dort ergänzen.
OK, dann werde ich das mal probieren.

Viele Grüße,
Stefan.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Teil einer Klasse in einer abgeleiteten Klasse umdefinie

  Alt 17. Okt 2008, 20:46
Naja, ich meine das du eine kleine Klasse machst wie folgt:
Delphi-Quellcode:
TBaseItem = class
  private
    // Felder
end;

TBaseList = class
  private
    fFilename : AnsiString;
    fLength : integer;
    fItems : array of TBaseItem;
  protected
    procedure setitem(item: TBaseItem, index: Integer); virtual;
    function getitem(index: Integer): TBaseItem; virtual;
    function additem(): TBaseItem; virtual;
// Array-Property evtl.
end;
Und dann später sowas:
Delphi-Quellcode:
TMyItem = class (TBaseItem)
    // Felder
end;

TMyList = class(TBaseList)
  protected
    function getitem(index: Integer): TMyItem; override; // inherited aufrufen und casten
    function additem(): TMyItem; override; // tmyitem erstellen !!
end;
Dann kannst du die sachen mit add und delete schon in der Basisklasse machen, und kannst trotzdem später die richtigen Klassen in das Array reinfüllen. Du musst natürlich immer über die überschriebenen Funktionen gehen (das Array ist ja eh private) damit du auch schon den richtigen Typ casten kannst.
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#5

Re: Teil einer Klasse in einer abgeleiteten Klasse umdefinie

  Alt 18. Okt 2008, 11:08
// inherited aufrufen und casten was meinst du mit casten?


Mir fällt gerade auf: wenn die Listenelemente kein record mehr sind, sondern Klassen, dann kann ich ja im Prinzip gar nichts mehr in der Liste umsortieren (weil Instanz1 := Instanz2 ja nur eine Referenz zuweist, aber keinen Inhalt.)
Dann widerum müsste ich ja auch in der Funktion GetItem irgendwo jedes einzelne Feld der Klasse abfragen und zuweisen.
result := fItems[i] würde dann ja meines Wissens nicht funktionieren.

Wenn das tatsächlich so ist, dann hätte einen Risen Aufwand und müsste dann auch das umsortieren für jede Liste unterschiedlichen Typs neu implementieren.

Oder liege ich falsch?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Teil einer Klasse in einer abgeleiteten Klasse umdefinie

  Alt 18. Okt 2008, 11:46
Zitat von changlee:
// inherited aufrufen und casten was meinst du mit casten?
Naja, da du in der Basisklasse ja sowas machst:
Delphi-Quellcode:
function TBaseList.getitem(index: Integer): TBaseItem;
begin
  Result = fitems[index];
end;
Solltest du in der abgeleiteten Klasse sowas machen:
Delphi-Quellcode:
function TMyList.getitem(index: Integer): TMyItem; // override;
begin
  Result = inherited getitem(index) as TMyItem;
end;

Zitat:
Mir fällt gerade auf: wenn die Listenelemente kein record mehr sind, sondern Klassen, dann kann ich ja im Prinzip gar nichts mehr in der Liste umsortieren (weil Instanz1 := Instanz2 ja nur eine Referenz zuweist, aber keinen Inhalt.)
Natürlich kannst du umsortieren.
Delphi-Quellcode:
temp = getitem(1);
setitem(1, getitem(2));
setitem(2, temp);
Zitat:
Dann widerum müsste ich ja auch in der Funktion GetItem irgendwo jedes einzelne Feld der Klasse abfragen und zuweisen.
result := fItems[i] würde dann ja meines Wissens nicht funktionieren.

Wenn das tatsächlich so ist, dann hätte einen Risen Aufwand und müsste dann auch das umsortieren für jede Liste unterschiedlichen Typs neu implementieren.

Oder liege ich falsch?
Wie gesagt, die grundlegenden Operationen kannst du in der Basisklasse einführen und implementieren, und später musst du dann nur noch die Logik implementieren die bei dem neuen Typ dazugekommen ist
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#7

Re: Teil einer Klasse in einer abgeleiteten Klasse umdefinie

  Alt 18. Okt 2008, 12:05
Ok, vielen Dank. Dann werde ich das alles mal so ausprobieren.

Gruß
Stefan.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:23 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