AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mal wieder Klassenvererbung

Ein Thema von Jelly · begonnen am 24. Jun 2004 · letzter Beitrag vom 25. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 13:30
Hallo,

ich habe mir eine Grundklasse TGeometrie erstellt und von dieser 2 weitere abgeleitet, nämlich TKugel und TQuader... Soweit kein Problem.

Desweiteren hab ich noch eine Klasse TGeometrien von TObject abgeleitet, und in dieser Klasse als Eigenschaft Items : array of TGeometrie, also ein dynamisches Array, welches all meine Geometrien enthalten soll...

Jetzt sollen aus einer Textdatei die Geometrien geladen werden, und in diesem Array gespeichert werden. In der Textdatei steht dann der Typ der Geometrie drin (Kugel oder Quader), und beim Erstellen der Geometrie benutz ich folgenden Code:
Delphi-Quellcode:
if GeomTyp is TKugel then Fitems[i] := TKugel.create ;
if GeomTyp is TQuader then Fitems[i] := TQuader.create ;
Das klappt auch soweit ganz gut. Allerdings ist diese Typabfrage sehr nervig wenn ich meine geometrischen Formen erweitern will (z.B. Tetraeder), weil ich dann auch in der klasse TGeometrien eine weitere if-Bedingung dazu brauch, damit ich richtig caste, und dies will ich irgendwie vermeiden, hab aber keine Ahnung wie?

Ich hoff ich drück mich klar genug aus... Ich will eben erreichen daß ich mich in der TGeometrien Klasse überhaupt nicht mehr um den wahren Typ von Items kümmern muß, sondern daß automatisch der richtige Typ genommen wird.

Gruß,
Tom
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 13:42
Schau die mal "class of" vielleicht hilft dir das weiter!

Delphi-Quellcode:
type
  TGeometryClass = class of TGeometry;

  TGeometryTyp = (tgKugel, tgQuader);

const
  cClass : array [TGeometryTyp] of TGeometryClass = (TKugel, TQuader);
fItem := cClass[ttKugel].Create; Ich hoffe das hilft.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 13:47
Eine kleine Abhandlung über virtuelle und abstrakte Methoden gibt's bei Delphi-Source.de!

Du musst also den Konstruktor von TGeometrie virtual abstract machen, dann klappt's folgendermaßen:
Fitems[i] := GeomTyp.Create;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 14:03
Moin!

Wenn man den Constructor virtuell abstrakt macht, dann weiss Delphi doch immernoch nicht für welche Klasse er sich entscheiden soll, weil das doch eigentlich von dem File abhängt aus dem geladen wird. Ich würde daher folgende Dinge vorschlagen:

1. Lege dir eine Metaklasse an für TGeometrie
2. Bau dir eine Funktion auf, die Klassen in einer Liste speichert. Übergeben wird eine Klasse die zu der Metaklasse passt (z.B. TQuader)
3. Speichere beim speichern den ClassName
4. beim Laden suche in der Liste von der Metaklassenliste nach einer Klasse mit dem Klassennamen und instanziiere diese über die MetaClass.

5. Nutze bei dir für deine TGeometries Klasse eine TObjectList als ein dynamisches Array, das macht die Verwaltung einfacher.

Beispiel zu dem Punkten 1. bis 4. kannst du dir z.B. in meiner XML Library auf meiner HP anschauen. Dort kann sich jeder einen eigenen Charset Encoding Filter schreiben und installieren. Dieses funktioniert genau nach dem Prinzip. Also schau dir mal wie ich die ISO8859-1 und UTF-8, etc registriere, verwalte und dann, wenn ich in der Datei ein charset encoding finde, instanziiere. (Die Registrierung wird bei den Charset Encodern im Initialize der Unit durchgeführt und damit die aufgerufen wird, muss die Unit einfach nur im Projektfile mit enthalten sein).

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 14:12
Zitat von Jelly:
Delphi-Quellcode:
if GeomTyp is TKugel then Fitems[i] := TKugel.create;
if GeomTyp is TQuader then Fitems[i] := TQuader.create ;
Das heißt doch, dass GeomTyp bereits mit TKugel.Create oder TQuader.Create erstellt wurde, oooder?
Also kann man GeomTyp.Create aufrufen und erhält somit eine Instanz der richtige Klasse!?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 15:00
Moin!

Mal abgesehen davon das der Code so oder so sehr irreführend ist, schreibt er doch, wer die items alle in eine Textdatei schreiben und beim laden nicht immer eine If Zeile mehr einfügen für einen neuen Typ. So oder so muss er von TextInformationen aus der Datei wieder auf eine Klasse kommen bzw. eine Klasseninstanz erstellen. Somit hilft ihm der Code Schnipsel eher weniger - und vor allem weiss ich auch nicht wie/was er da macht. Zumindest hilft ihm ein virtueller abstrakter Constructor in dem Falle auch nicht soweit ich mir das so durchdenke.

Summa Sumarum: Ich bezog mich eher auf seine Beschreibung als auf seine Codeschnipsel.

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 15:14
So genehm?
Delphi-Quellcode:
unit frVererbung;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TGeometrie = class(TPersistent)
    constructor Create; virtual; abstract;
  end;

  TKugel = class(TGeometrie)
    constructor Create; override;
  end;

  TQuader = class(TGeometrie)
    constructor Create; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TQuader }

constructor TQuader.Create;
begin
  inherited;
  ShowMessage(ClassName);
end;

{ TKugel }

constructor TKugel.Create;
begin
  inherited;
  ShowMessage(ClassName);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TGeometrie(FindClass('TKugel').Create).Create;
  TGeometrie(FindClass('TQuader').Create).Create;
end;

initialization
  RegisterClass(TKugel);
  RegisterClass(TQuader);

finalization
  UnRegisterClass(TKugel);
  UnRegisterClass(TQuader);

end.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 15:23
Vielen Dank für die vielen Anregungen, womit ich schon mein beschränktes Wissen wesentlich auffrischen konnte. Es ist einiges Brauchbares dabei, aber wie Muetze1 bereits geschildert hab, muss ich immer irgendwie in meiner TGeometrien Klasse entscheiden, was passieren soll. Der Grund liegt darin, weil ich das Auslesen der Daten aus der Textdatei nicht in TKugel oder TQuader ablagern kann, da ich ja im Vorfeld die Klasse instanzieren muss... Ich weiss, mein Problem ist ziemlich verstrickt. Werd also nicht beim Definieren einer neuen Geometrieklasse drumrumkommen, auch in TGeometrien jeweils ne Zeile hinzuzufügen...

Aber nochmals danke... Eure Ansätze und Mühe sind Klasse.

Gruß,
Tom
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 15:23
Moin!

Mir ist egal, ich mache nur Vorschläge, er muss es entscheiden.

Ich für meinen Teil würde dabei aber schon wieder sagen, das TPersistent für seinen Zweck zu viel/gross ist... Ein normales TObject Descandent hätte auch gereicht, dafür müsste man das mit der MetaClass selber machen und kann halt kein RegisterClass() und FindClass() nutzen.

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Mal wieder Klassenvererbung

  Alt 24. Jun 2004, 18:09
Zitat von Stevie:
So genehm?
Das überschreiben des constructors ist nicht nötig.
In der Anlage ist der Beweis.
Angehängte Dateien
Dateityp: zip zip_984.zip (213,4 KB, 7x aufgerufen)
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:12 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