AW: Setter mehrfach überschreiben.
Er meint einen RT-OI. Ich weiß aber nicht, wie der genau umgesetzt ist.
|
AW: Setter mehrfach überschreiben.
Zitat:
|
AW: Setter mehrfach überschreiben.
Zitat:
Der OI kann auch ein TCustomControl erwarten (was blöd wäre, weil er dann kein Object-Inspector wäre, sondern ein CCI, ein 'CustomControl-Inspector'. Aber selbst wenn er das erwarten würde, ermittelt er zur Laufzeit per RTTI die Editoren/Zeilen, und zwar anhand des konkreten Typen des darzustellenden Objekts. Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Nehmen wir an, wir haben Figuren auf einem Tisch liegen, jede Figur hat eine Position:
Editor := TEditorFactory.Create(SelectedFigure);
Editor.Add(X,Y);
Delphi-Quellcode:
Berechnung der Gesamtfläche
For figure in FiguresOnTable do begin
Painter := TPainterFactory.Create(figure.figure); Painter.Paint(figure.Location); End;
Delphi-Quellcode:
Immer die selbe Soße.
For figure in FiguresOnTable do begin
SurfaceCalculator := TSurfaceCalculatorFactory.Create(figure.figure); TotalSurface := TotalSurface + SurfaceCalculator.Surface; End; Anstatt deine Klasse immer weiter aufzublähen (Anti-OCP), baust Du für jede Funktion eine neue Klassenfamilie. Natürlich kannst du für elementare Operationen eine Basisklasse nehmen, aber wenn Du Dich dabei ertappst, diese für neue Funktionen zu erweitern, verstößt Du gegen SRP und OCP. Das sollte ein Warnsignal sein, falls Du OOP-konform sein willst. Zitat:
|
AW: Setter mehrfach überschreiben.
Die Basisklasse gibt es nicht mehr (hatte ich doch schon geschrieben?). Und z.B. hier wünsch ich dir mit 70 Klassen viel Spaß:
Delphi-Quellcode:
procedure TGraphicObjectList.AddList(Value: TGraphicObjectList);
var I, Index: integer; begin for I := 0 to Value.Count - 1 do begin if Value[I] is TGraphicObject1 then Index := Add(TGraphicObject1.Create) else if Value[I] is TGraphicObject2 then Index := Add(TGraphicObject2.Create) else Index := Add(TGraphicObject3.Create); Items[Index].Assign(Value[I]); end; end; procedure TGraphicObjectList.Assign(Value: TGraphicObjectList); begin Clear; AddList(Value); end; |
AW: Setter mehrfach überschreiben.
Du musst das etwas strukturierter betrachten.
Basisklassen sind ja gut und nützlich. Aber sie müssen nur das wissen und können, was wirklich alle Ableitungen gemeinsam haben. Wenn Du eine Objektkopie erzeugen willst, dann kann Deine Basisklasse z.B. folgende Methode haben.
Delphi-Quellcode:
und die Ableitungen spezifizieren das:
TBaseClass = class
function CreateCopy: TBaseClass; virtual; end; function TBaseClass.CreateCopy: TBaseClass; begin Result := nil; end;
Delphi-Quellcode:
So brauchst Du später nicht nach Klassen unterscheiden und rufst einfach NewItem := aItem.CreateCopy auf.
TClassA = class(TBaseClass)
function CreateCopy: TBaseClass; override; end; function TClassA.CreateCopy: TBaseClass; var A: TClassA; begin A := TClassA.Create; A.Assigned(Self); // hier kann man auch noch beliebige andere (klassenspezifische) Dinge anstellen Result := A; end; Mit Assign funktioniert das ja genau so. Du musst also so viel wie möglich in Klassen kapseln und gemeinsame Eigenschaften so weit oben deklarieren wie notwendig. Dann wird das von allein übersichtlicher. Wenn man keine gemeinsame Basisklasse verwenden kann oder will, kann man auch Interfaces benutzen. Das hat Vor- und Nachteile, ist aber auf jeden Fall etwas komplexer. |
AW: Setter mehrfach überschreiben.
Ja doch. So hab ich‘s doch (Siehe z.B. Assign), anders wär’s ja ein Krampf? Aber um ein spezifisches Create kommst du nicht herum, sonst greift das override ja nicht.
|
AW: Setter mehrfach überschreiben.
Zitat:
Delphi-Quellcode:
type
TGraphicObjectClass = class of TGraphicObject; procedure TGraphicObjectList.AddList(Value: TGraphicObjectList); var I: integer; NewItem: TGraphicObject; begin for I := 0 to Value.Count - 1 do begin NewItem := TGraphicObjectClass(Value[I].ClassType).Create; Add(NewItem); NewItem.Assign(Value[I]); end; end; |
AW: Setter mehrfach überschreiben.
Zitat:
|
AW: Setter mehrfach überschreiben.
Nö, jeet nicht. :)
|
AW: Setter mehrfach überschreiben.
Wot? Wieso nicht? Wird nicht der gleiche Datentyp kreiert?
|
AW: Setter mehrfach überschreiben.
Probiers halt aus. Variante wäre direkt mit TGraphicObjectClass zu arbeiten, das geht. Dann kann aber nicht mehr Is Typ1,2,3 abfragen.
So getestet:
Delphi-Quellcode:
TObject0 = class
private FA: integer; FB: integer; FC: integer; public property A: integer read FA write FA; property B: integer read FB write FB; property C: integer read FC write FC; procedure Assign(Value: TObject0); virtual; end; TObject1 = class(TObject0) private FSL: TStringList; public property SL: TStringList read FSL; procedure Assign(Value: TObject0); override; constructor Create; destructor Destroy; override; end; { TObject0 } procedure TObject0.Assign(Value: TObject0); begin FA := Value.A; FB := Value.B; FC := Value.C; end; { TObject1 } procedure TObject1.Assign(Value: TObject0); var O: TObject1; begin inherited; O := TObject1(Value); FSL.Assign(O.SL); end; constructor TObject1.Create; begin inherited; FSL := TStringList.Create; end; destructor TObject1.Destroy; begin FSL.Free; inherited; end; procedure TTestForm.Button1Click(Sender: TObject); type TObjectClass = class of TObject0; var A: TObject1; B: TObject0; begin A := TObject1.Create; try B := TObjectClass(A.ClassType).Create; try B.Assign(A); finally B.Free; end; finally A.Free; end; end; |
AW: Setter mehrfach überschreiben.
Hab kein Delphi, aber dafür brauchst Du dann doch wieder eine Basisklasse:
Delphi-Quellcode:
getippt und nicht getestet.
TBasisKlasse = Class
public constructor Create; Virtual; End; TA = Class (TBasisKlasse) end; TBasis = class of TBasisKlasse; Constructor TBasisKlasse.Create; begin end; Var a,b : TBasisKlasse; begin a := TA.Create; b := TBasis(a.ClassType).Create; end; |
AW: Setter mehrfach überschreiben.
Liest du die Posts eigentlich? :gruebel:
TObject0 ist die Basisklasse. Und ja, ich hab auch eine. Siehe Posts 1- 10, die Kommentare in #9. Die TWerkzeug gibst nur nicht mehr. |
AW: Setter mehrfach überschreiben.
Das Problem ist, dass sich Deine Beispiele immer auf Deine aktuelle Projektstruktur beziehen und losgelöst nicht so ganz klar sind.
Mein Vorschlag: Baue Dir mal ein völlig eigenständiges Testprojekt mit Fahrzeugen (Auto, Fahrrad, Boot), Tieren (Ente, Fisch) und Früchten (Apfel, Banane). So siehst Du eindeutig, welche Klassen Gemeinsamkeiten haben und welche nicht. Die Klassen brauchen ja nichts wirklich zu machen. Wenn alles kompilierbar ist, reicht das ja schon aus. Ich hatte das mal bei einer Interface-Demo so gemacht: http://www.delphipraxis.net/183702-i...-factorys.html |
AW: Setter mehrfach überschreiben.
Zitat:
Zitat:
Zitat:
Verpasse TObject0 einen virtuellen Konstruktor und dann kann man auch Objekte anhand des 'ClassType' erzeugen. Damit kannst Du klonen und alles ist gut. Die Operationen auf deine Figuren bildest du über einzelne Arbeiter ab, die Du dann über die Figurklasse per Faktory erzeugst. Wenn Du das auf die Spitze treiben willst, baue Dir eine Factory-Factory und dann ist das richtig geil (also OCP-technisch) Tipparbeit: Ja. Übersichtlich: Ja. Oop: Ja. SRP+OCP konform: Ja. Aber natürlich führen auch andere Wege zum Ziel. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz