Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OOP machts mir schwer (Design von Klassen) (https://www.delphipraxis.net/114638-oop-machts-mir-schwer-design-von-klassen.html)

Neutral General 28. Mai 2008 17:03


OOP machts mir schwer (Design von Klassen)
 
Hi,

Also ich befinde mich gerade in folgender Situation: Ich habe eine Basisklasse und 3-4 davon abgeleitete Klassen. Sagen wir mal das ganze sieht so aus (aufs wesentliche reduziert):

Delphi-Quellcode:
TBase = class

end;

TClass1 = class(TBase)
  procedure DoSomething;
end;

TClass2 = class(TBase)
  procedure DoSomething;
end;


TClass3 = class(TBase)
  procedure DoSomething;
end;

// etc
Nun würde man es intelligenterweise so machen:

Delphi-Quellcode:
TBase = class
 procedure DoSomething;
end;
Jedoch gibt es das Problem, dass sich die Procedure DoSomething in jeder abgeleiteten Klasse in ungefähr genau einer Code-Zeile unterscheidet, wodurch ich sie nicht einfach von TBase erben kann. Außerdem ist diese Zeile auch nicht am Anfang oder am Ende der Procedure, so dass ich nicht mit inherited arbeiten kann, sondern die ganze Procedure bis auf eine Zeile genau abschreiben muss... nun hatte ich eine Idee:

Delphi-Quellcode:
TBase = class
protected
  procedure Zeile; virtual;
public
  procedure DoSomething;
end;

TClass1 = class(TBase)
protected
  procedure Zeile; override;
end;

procedure TBase.Zeile;
begin
end;

procedure TBase.DoSomething;
begin
  // Code
  Zeile;
  // Code;
end;

procedure TClass1.Zeile;
begin
  // Zeile in TClass1
end;
Nur bin ich mir nicht so sicher, ob diese Lösung so schön ist...

Was sagt ihr dazu? Gibt es bessere Methoden?

Gruß
Neutral General

Phoenix 28. Mai 2008 17:13

Re: OOP machts mir schwer (Design von Klassen)
 
Die Idee ist gar nicht mal so schlecht.

Ich würde diese Methode Abstrakt definieren, so dass jede Ableitung diese Methode implementieren muss. Natürlich kannst Du dann die Basisklasse nicht mehr instanzieren, aber das ist ja vielleicht auch gar nicht notwendig?

shmia 28. Mai 2008 17:17

Re: OOP machts mir schwer (Design von Klassen)
 
Du könntest das Template Method Design Pattern einsetzen. http://de.wikipedia.org/wiki/Schablonenmethode (siehe auch die englisch WP)
1.) in der Basisklasse wird der allgemeine Ablauf vorgegeben. Diese Methode ist public.
Delphi-Quellcode:
TBase = class
private
  procedure Vorberechnung;
  ...
protected
  procedure Phase1; virtual; abstract
  procedure Phase2; virtual; abstract;
public
   procedure DoSomething;
end;

procedure TBase.DoSomething;
begin
  // ein fiktiver Ablauf
  Vorbrechnung;
  Phase1;
  SaveData;
  if bedingung then
    Phase2;
end;
2.) die virtuellen Methoden Phase1 und Phase2 werden in den abgeleiteten Klassen überschrieben und bleiben protected.

Neutral General 28. Mai 2008 17:33

Re: OOP machts mir schwer (Design von Klassen)
 
Zitat:

Zitat von shmia
Du könntest das Template Method Design Pattern einsetzen. http://de.wikipedia.org/wiki/Schablonenmethode (siehe auch die englisch WP)
1.) in der Basisklasse wird der allgemeine Ablauf vorgegeben. Diese Methode ist public.

[...]

2.) die virtuellen Methoden Phase1 und Phase2 werden in den abgeleiteten Klassen überschrieben und bleiben protected.

So war das ganze auch gedacht :)

Zitat:

Zitat von Phoenix
Die Idee ist gar nicht mal so schlecht.

Ich würde diese Methode Abstrakt definieren, so dass jede Ableitung diese Methode implementieren muss. Natürlich kannst Du dann die Basisklasse nicht mehr instanzieren, aber das ist ja vielleicht auch gar nicht notwendig?

Danke :) Ja ich denke, ich mache es auch abstrakt. Die Basisklasse soll tatsächlich nicht erstellt werden.

Also ihr habt mir sehr geholfen ;)
Die größte Schwierigkeit, die jetzt noch besteht und bei der ihr mir nicht helfen könnt, ist einen Namen für meine abstrakte Procedure zu finden :gruebel: :wall: :roll:

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz