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
Benutzerbild von stahli
stahli

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

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
 
#2

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
440 Beiträge
 
#3

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
Bjoerk

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

AW: Setter mehrfach überschreiben.

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

n/a Beiträge
 
#5

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 14:53
Wot? Wieso nicht? Wird nicht der gleiche Datentyp kreiert?
  Mit Zitat antworten Zitat
Bjoerk

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

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 15:06
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;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Setter mehrfach überschreiben.

  Alt 12. Jun 2015, 15:21
Hab kein Delphi, aber dafür brauchst Du dann doch wieder eine Basisklasse:
Delphi-Quellcode:
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;
getippt und nicht getestet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:08 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