![]() |
AW: Interfaces + Factorys
Zitat:
Aus welchen technischen Gründen werden bei Klassen die Getter/Setter idR nicht public deklariert? |
AW: Interfaces + Factorys
Technisch gesehen ist das natürlich gleich.
Aber wenn man sich erst neu mit Interfaces befasst kann halt etwas undurchsichtig sein und Einsteiger verstehen die Zusammenhänge nicht direkt. Wenn man erst mal verstanden hat wie es läuft, dann kommt man damit allerdings zurecht - geht jedenfalls mir so. Jedenfalls weiß ich jetzt, dass ich Getter und Setter deklarieren muss, mir die Codevervollständigung diese aber nicht andauernd unter die Nase reibt wenn sie privat sind. Damit kann ich leben. |
AW: Interfaces + Factorys
Das mit dem Getter/Setter muss ich doch schon ohne Interfaces verstanden haben und warum diese idR nicht als public deklariert werden. Dann versteht man auch warum es schnurz ist, wenn man doch darauf zugreifen kann (weil das technisch bedingt bei Interfaces so ist und nicht anders möglich ist).
|
AW: Interfaces + Factorys
Wofür braucht man technisch gesehen überhaupt Sichtbarkeiten?
|
AW: Interfaces + Factorys
Zitat:
|
AW: Interfaces + Factorys
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:
Die Interfaces könnten dann so aussehen:
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;
Delphi-Quellcode:
So könnte man dem Auto verschiedene Motoren hinzufügen.
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; 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.) |
AW: Interfaces + Factorys
Mal ganz weg von der Programmierung, aber das Betanken an und für sich im Sinne von "fülle das nach, damit der Motor arbeiten kann" ist doch für jeden Motor in diesem Sinne gleich.
Das was man tankt muss zum Motor passen, aber "Tanken" müssen sie alle (vor allem weil "Tanken" das Befüllen eines "Tanks" -> Vorratsbehälters beschreibt ohne dabei das Tankgut oder den Tank irgendwie einzuschränken). Also ist Tanken als Methode völlig ok (wenn das, was man tankt in diesem Kontext keine Rolle spielt bzw. spielen muss). Einen konkreten Dieselmotor würde man dann mit einer Verbindung zu einem Diesel-Lieferanten erzeugen, den Benzinmotor mit einer Verbindung zu einem Benzin-Lieferanten und den Elektromotor mit einem Strom-Lieferanten. ;) |
AW: Interfaces + Factorys
Den Unterschied zwischen Tanken und Aufladen habe ich nur exemplarisch ins Spiel gebracht.
Es kann ja in echten Fällen möglicherweise Unterschiede geben, die für den weiteren Verlauf relevant sind. Das ERZEUGEN eines Autos mit einem bestimmten Motor sehe ich nicht als Problem. Aber später müsste ich immer prüfen: - Kann das Objekt, das ich hier habe einem Motor haben? - Hat es tatsächlich einen Motor? - Kann ich damit tanken und was oder an die Steckdose? Würdest Du also meine zwei Schnittstellen IMotor (die dann eine tatsächliche Motorinstanz representiert) und eine Schnittstelle IHasMotor (oder eigentlich besser: IKannMotorHaben) (die einem Auto und Boot hinzugefügt wird, nicht aber einem Fahrrad oder Vogel) sinnvoll finden? |
AW: Interfaces + Factorys
Man kann das mit dem Motor auch anders darstellen
Delphi-Quellcode:
Jetzt kann der Motor prüfen, ob die Quelle den richtigen Betriebsstoff liefert und sich die benötigte Menge entnehmen. ;)
IBetriebsstoffQuelle = interface
function GetBetriebsstoffArt : Integer; procedure Entnehme( AMenge : Single ); end; IMotor = interface procedure Tanken( AQuelle : IBetriebsstoffQuelle ); end; |
AW: Interfaces + Factorys
Zitat:
Sinnvoller erscheint mir etwas wie
Delphi-Quellcode:
Mit
IMotorBetrieben = interface
funtion GetMotor : IMotor; end; IMobil = interface procedure BewegeZu( Ort : TPoint ); end; IKannSprechen = interface procedure Sage( AText : string ); end;
Delphi-Quellcode:
fragt man dann ab, ob dieses oder jenes Interface unterstützt wird und führt das dann aus:
Supports
Delphi-Quellcode:
procedure Sage( AText : string; AContext : IInterface );
var LSprecher : IKannSprechen; begin if Supports( AContext, IKannSprechen, LSprecher ) then LSprecher.Sage( AText ); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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