Autor Beitrag
Elrond Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 02.01.09 01:45 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconElrond hat folgendes geschrieben Zum zitierten Posting springen:
Bei Init habe ich sehr wohl verschiedene Parameterzahlen. Bei einem Objekt vom Typ ganze Zahl ist es ein Integer-Wert, bei einem Bruch sind es zwei Integer-Werte. Den Bruch kann ich nicht übergeben, denn dessen Werte sollen ja erst initialisiert werden.
Aber bei der Initialisierung ist doch keine allgemeingültige Lösung nötig. :gruebel:
Da musst du doch ohnehin das Objekt gezielt mit einem bestimmten Typ erstellen. Und dann kannst du es dabei auch direkt initialisieren. Immer wenn du die mit den Werten direkt arbeitest, kannst du doch ohnehin nicht mehr allgemein bleiben.


Da hast du natürlich recht. Aber es wäre halt allgemeingültig schöner gewesen. Was mich primär interessiert ist, wie p einmal ein Objekt vom Typ TVektor repräsentieren kann und einmal ein Objekt vom Typ TKomplex, so dass zentral wirklich nur einmal p1.Addiere(p2) auftaucht. Von welchem Typ sollte die Variable p dann sein?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.09 01:49 
Entweder muss die Variable den Typ der Oberklasse oder des Interfaces haben, je nachdem wie du es implementierst. Und natürlich musst du auch override und nicht overload benutzen, sonst überschreibst du die abstrakte Klasse nicht, und dann gibt es natürlich einen Fehler.
Elrond Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 02.01.09 02:06 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Entweder muss die Variable den Typ der Oberklasse oder des Interfaces haben, je nachdem wie du es implementierst. Und natürlich musst du auch override und nicht overload benutzen, sonst überschreibst du die abstrakte Klasse nicht, und dann gibt es natürlich einen Fehler.


Ok. Dann nehmen wir mal dieses Beispiel:

TMatheObjekt=Class(TObject)
private
sig:string;
public
procedure Add(s:TMatheObjekt); virtual;abstract;
...
end;

TKomplex = Class(TMatheObjekt)
private
re,im:Extended;
public
procedure Add(s:TKomplex); override;
end;

Das mag der Compiler nicht: [Fehler] Unit1.pas(93): Deklaration von 'Add' unterscheidet sich von vorheriger Deklaration.

Wenn ich jedoch in der abgeleiteten Klasse

procedure Add(s:TMatheObjekt); override;

schreibe, dann kennt die überschriebene Prozedur Add bei der Implementierung die Variablen re und im nicht mehr.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.09 02:28 
In der Implementierung musst du die übergebene Variable nach TKomplex casten. ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if s is TKomplex then
begin
  re := re + TKomplex(s).re;
  im := im + TKomplex(s).im;
end;
is prüft, ob das übergebene Objekt den richtigen Typ hat, und danach kannst du dann hart casten ohne weitere Prüfung.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 02.01.09 10:16 
Also ich würde die Initialisierung mit einem Konstruktor machen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Type
  TObject1 = Class (TBase)
    Constructor Create (einParameter : TBase);
  End;

  TObject2 = Class (TBase)
    Constructor Create (einParameter, nochEinParameter : TBase);
  End;
...

Wenn Du einen einheitlichen 'Grundkonstruktor' willst, dann spendierst Du jeder Klasse ein parameterloses Create, das von jedem parametrierten 'Create' aufgerufen wird. So mach ich das jedenfalls mit solchen Klassenfamilien.

_________________
Na denn, dann. Bis dann, denn.
Elrond Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 02.01.09 13:20 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
In der Implementierung musst du die übergebene Variable nach TKomplex casten. ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if s is TKomplex then
begin
  re := re + TKomplex(s).re;
  im := im + TKomplex(s).im;
end;
is prüft, ob das übergebene Objekt den richtigen Typ hat, und danach kannst du dann hart casten ohne weitere Prüfung.


Das war's. Alles läuft wie gewünscht. Herzlichen Dank. :zustimm: :dance: