AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Setter mehrfach überschreiben.

Ein Thema von Bjoerk · begonnen am 8. Jun 2015 · letzter Beitrag vom 12. Jun 2015
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#41

AW: Setter mehrfach überschreiben.

  Alt 11. Jun 2015, 12:32
Er meint einen RT-OI. Ich weiß aber nicht, wie der genau umgesetzt ist.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#42

AW: Setter mehrfach überschreiben.

  Alt 11. Jun 2015, 12:37
Er meint einen RT-OI. Ich weiß aber nicht, wie der genau umgesetzt ist.
Aso, aber vom "Verhalten" her doch bestimmt ähnlich dem IDE-OI.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#43

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 03:20
Du hast mich immer noch nicht verstanden. Was machst du, wenn du ein rundes Control hast, aber TCustomControl keine Radius Prop hat, dein Objectinspector aber ein TCustomControl erwartet?
Wieso sollte der OI ein TCustomControl erwarten? Verstehe ich nicht. Der OI erwartet ein Objekt, geht per RTTI die Eigenschaften durch und erstellt für jede published Property einen Editor. Dem ist doch wurscht, was Du ihm gibst.

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.

Es ist nur so, daß die einzelnen Klassen, die davon abgeleitet sind, nicht jede Methode bzw. jede Property haben.
Genau das ist es, was dein Design 'falsch' macht. Deine Basisklasse soll nicht wissen, was eventuell einer ihrer Kinder für Eigenschaften haben könnte und einfach mal auf Verdacht eine abstrakte Eigenschaft einführen. Das ist kein OOP.

Ok. Also: Ich habe 3 Klassen ala TShape (TWerkzeug1,2,3). Jede TWerkzeug Class kann so 15-25 Figuren zeichnen.
Imho falsch.
Zitat:
Der User wählt mit dem Speedbutton eines von ca. 70 zu zeichnenden Objecte aus. ... wenn Polygon -> dann TWerkzeug2 -> dann FWerkzeug2.Polygon.Add(X, Y).
Delphi-Quellcode:
Editor := TEditorFactory.Create(SelectedFigure);
Editor.Add(X,Y);
Nehmen wir an, wir haben Figuren auf einem Tisch liegen, jede Figur hat eine Position:
Delphi-Quellcode:
For figure in FiguresOnTable do begin
  Painter := TPainterFactory.Create(figure.figure);
  Painter.Paint(figure.Location);
End;
Berechnung der Gesamtfläche
Delphi-Quellcode:
For figure in FiguresOnTable do begin
  SurfaceCalculator := TSurfaceCalculatorFactory.Create(figure.figure);
  TotalSurface := TotalSurface + SurfaceCalculator.Surface;
End;
Immer die selbe Soße.
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:
Ich suche eigentlich nur ein elegantes Handling für diese 3 Klassen.
Mach mehr Klassen: 70 Figurtypen und 3 Klassen? Das kann nicht gehen, jedenfalls nicht mit OOD.

Geändert von Dejan Vu (12. Jun 2015 um 03:27 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#44

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 11:56
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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#45

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 12:15
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:
TBaseClass = class
  function CreateCopy: TBaseClass; virtual;
end;

function TBaseClass.CreateCopy: TBaseClass;
begin
  Result := nil;
end;
und die Ableitungen spezifizieren das:


Delphi-Quellcode:
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;
So brauchst Du später nicht nach Klassen unterscheiden und rufst einfach NewItem := aItem.CreateCopy auf.

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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#46

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 12:54
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.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#47

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 13:45
Aber um ein spezifisches Create kommst du nicht herum, sonst greift das override ja nicht.
Der Klassentyp der Quellklasse ist doch bekannt. Also geht doch:
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;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#48

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 14:36
hier wünsch ich dir mit 70 Klassen viel Spaß:
samso hatte den Spaß.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#49

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 14:43
Nö, jeet nicht.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#50

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 14:53
Wot? Wieso nicht? Wird nicht der gleiche Datentyp kreiert?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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