Autor Beitrag
Claus
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 09.04.03 20:16 
Hallo,
ich versuche mich mit objektorienter Programmierung (Anfänger).
Das Programm soll diverse geometrische Querschnittswerte ermitteln

Dazu habe ich erstmal ein Objekt TQuerschnitt definiert und davon verschieden Klassen abgeleitet (TKreis, TPolygon). Jetzt will ich in den Klassen z.B. die Fläche ermitteln und dann einheitlich weiterverwurschteln. Wie kriege ich denn die Werte in TQuerschnitt rein?

Ich habs so probiert:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type TQuerschnitt = class(TObject)
private
Flaeche: single;
public
Bez: String;
Loch: Boolean;
ys,zs: single;
...
function Iu:  single; 


type TKreis = class(TQuerschnitt)
private
Flaeche: single;
function Flaeche: single;
public
...
property A: single read Flaeche;
....

implementation

function TKreis.Flaeche;
begin
result:= SQR(D)*PI/4-SQR(D-2*T)*PI/4;
if Loch then result:= result*-1
end;
...

function TQuerschnitt.Iu;
begin result := Iy-zs*zs*Flaeche end;


Moderiert von user profile iconAya: CodeTags hinzugefügt.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mi 09.04.03 21:32 
ja...das ist einfach :D

Das zauberwort heisst polymorphie und machen tut man das mit virtuellen methoden. Will heissen du definierst in der grund-klasse ein property:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
type 
TQuerschnitt = class(TObject) 
...
  function getFlaeche:single; virtual;
...
  property Flaeche: single read getFlaeche;
end;

die funktion getFlaeche kann noch nix (gibt in dieser klasse 0 zurück). Jetzt kannst du beigehen und in den abgeleiteten klassen diese methode 'overriden':
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type 
TKreis = class(TQuerschnitt) 
...
  function getFlaeche:single; override;
...
end;
..
function TKreis.getFlaeche:single;
begin
  result := 2*r*pi;
end;
So...die property musst du nur in der base-klasse definieren, welche dann die überschriebenen methoden, aus den jeweiligen klasse aufruft!

Hoffe es hilft?

_________________
mfg.
mâximôv
Nightmare_82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 260



BeitragVerfasst: Do 10.04.03 01:12 
brauchst virtual;abstract; für leere methoden, auf jeden Fall bei Delphi6
Claus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 10.04.03 06:42 
Herzlichen Dank für die Hilfe. :D
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 10.04.03 10:34 
Nightmare_82 hat folgendes geschrieben:
brauchst virtual;abstract; für leere methoden, auf jeden Fall bei Delphi6


Brauchen tut mans nicht...kann aber. Abstrakte klassen sinds aber für anfäger doch recht verwirrend :wink: Wenn du abstract benutzt müssen die methoden zwingend, in den folge-klassen, überschrieben werden!

_________________
mfg.
mâximôv
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 10.04.03 11:31 
Hallo,

du definierst in jeder Kasse eine Variable Flaeche vom Typ Single. Das ist nicht nötig, da diese je vererbt werden kann deklariere sie einfach im protected Block der Basisklasse, dann steht sie auch allen nachfahren zur verfügung:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type TQuerschnitt = class(TObject)
protected // nicht Private da es sonst auch vor nachfahren versteckt wird
  Flaeche: single;
public
Bez: String;
Loch: Boolean;
ys,zs: single;
[...]

desweiteren darfst du keile Funktion Flaeche deklarieren, wenn es schon eine Variable mit diesem Namen gibt:
ausblenden Quelltext
1:
2:
3:
4:
type TKreis = class(TQuerschnitt)
private
Flaeche: single; // Dies kann entfallen wenn du meinen Tipp von oben berücksichtigst.
function Flaeche: single; // Das gibt einen Fehle nenne die Funktion BerechneFlaeche oder so ähnlich


Gruß
Klabautermann
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 10.04.03 11:40 
IMHO braucht der gute die variable Flaeche garnicht, wenn er eine property fläche macht und flaeche, direkt mit getFlaeche, aus den geometrischen daten erzeugt....

_________________
mfg.
mâximôv
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 10.04.03 14:18 
@Maximus:

Teilweise ist eine Pufferung aus Performancegründen sinnvoll (wenn dieses Property nun millionenmal abgerufen wird, sich die Fläche aber gar nicht ändert).

Cu,
Udontknow
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 10.04.03 17:18 
da muss ich dir leider recht sprechen :evil: hörte sich aber nicht so an, als wolle er irgendeine echtzeit-welt-maschinen-simulation machen :wink:

_________________
mfg.
mâximôv
Claus Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 10.04.03 19:34 
Titel: noch nicht kapiert.
Hallo,
Danke für die rege Diskussion. Die Echtzeit-Weltmaschinen-Simulation ist tatsächlich erst mein übernächstes Projekt.
Momentan backe ich etwas kleiner Brötchen.

Also:
Der Weg mit der Definition der function getFlaeche in TQuerschnitt funktioniert bei mir. Allerdings mäkelt der Compiler, daß die Deklaration keine Funktion findet. Als muß ich eine Funktion definieren, die nichts weiter tut.
z.B.
function TQuerschnitt.GetFlaeche;
begin result := 0; end;

Richtig??
Dann ist das in möglicher Weg.

So wie die Variante mit der Vererbung der Variablen Flaeche funktioniert, so hatte ich mir das eigentlich vorgestellt. Mit dem protected-Block ist ein guter Hinweis. Aber wie du richtig anmerkst, kann ich keine Funktion Flaeche mehr definieren.

TKreis.Flaeche enthält erst mal nichts.
Wie kommt das Ergebnis von TKreis.BerechneFlaeche in Flaeche??
Irgendwie steh ich da am Schlauch.

Claus
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 11.04.03 10:53 
ausblenden Quelltext
1:
2:
3:
4:
TKreis.BerechneFlaeche;
begin
  Flaeche := xyz*$233+sqrt(power(bla)*muku); // :)
end;
Einfach direkt in flaeche reinrechnen! Du musst dann aber sicherstellen, dass dir variable Flaeche immer auf dem aktuellen stand ist...du musst quasi 'BerechneFlaeche' immer aufrufen, wenn du einen wert setzt. Das machst du am besten auch mit ner property, die eine Set-procedure hat. ZB:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type 
TKreis = class(TQuerschnitt)
  ...
  FRadius:single; // F... = field -> ist standart programmierweise!
  procedure SetRadius(value:single);
  ...
  Property Radius : single read FRadius write SetRadius;
end;
...
procedure TKreis.SetRadius(value:single);
begin
  FRadius := value;
  BerechneFlaeche; 
end;
so wird Flaeche immer geUpdatet wenn einen neuen Radius setzt.

_________________
mfg.
mâximôv