Jetzt muss ich noch etwas zum Video 2 + 3 nachfragen (Stand hochgeladenes Projekt vom ersten Beitrag).
Ich habe zwei Fahrzeuge, die einen Motor haben (Auto und Boot).
Jetzt könnte man sich noch ein Elektrofahrrad einführen, hätte also 3 Klassen mit einem Motor.
Wenn IMotor StarteMotor und Tanken implementiert, müssen das die 3 Klassen auch unmittelbar tun.
Auto und Boot könnten aber mit einem Benzin-, Diesel- oder Elektromotor ausgestattet werden.
Wäre es somit nicht vielleicht sinnvoll, eine Klasse TMotor UND dazugehörige Schnittstelle IMotor einzuführen?
Dann könnten die Fahrzeuge so aussehen:
Bsp. Auto:
Delphi-Quellcode:
TAuto = class(TInterfacedObject, IHasMotor)
private
FMotor: IMotor;
FAnzahlRaeder: Integer;
procedure SetAnzahlRaeder(const Value: Integer);
procedure Fahre;
//procedure StarteMotor;
//procedure Tanken;
public
property Motor: IMotor read get_Motor write set_Motor;
property AnzahlRaeder: Integer read FAnzahlRaeder write SetAnzahlRaeder;
end;
Die Interfaces könnten dann so aussehen:
Delphi-Quellcode:
IMotor = interface
procedure StarteMotor;
procedure Tanken;
end;
IHasMotor = interface
function get_Motor: IMotor;
procedure set_Motor(const Value: IMotor);
property Motor: IMotor read get_Motor write set_Motor;
end;
So könnte man dem Auto verschiedene Motoren hinzufügen.
Allerdings könnte ein Elektromotor dann nicht tanken sondern man würde die Batterie aufladen.
Ich muss also zur Laufzeit ggf. immer prüfen, welcher Motor eingebaut ist und ob überhaupt einer existiert.
Klar, man kann der Fabrik schon sagen: Gib mir ein Auto mit Elektromotor zurück, aber zur Laufzeit weiß man ja dann dennoch nicht, was man nun genau vorliegen hat.
An der Stelle komme ich nicht ganz weiter.
Wie würdet Ihr damit umgehen? (Aber bitte nicht auf das Spring-Framework o.ä. verweisen, damit das hier nachvollziehbar bleibt.)