AGB  ·  Datenschutz  ·  Impressum  







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

Constructor from Instance

Ein Thema von Stefan1286b · begonnen am 15. Jan 2024 · letzter Beitrag vom 17. Jan 2024
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Constructor from Instance

  Alt 15. Jan 2024, 07:46
Jetzt noch ClassType statt Class
Äh, ja
und dann geht's!
... und sogar ohne virtuellen Konstruktor
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Constructor from Instance

  Alt 15. Jan 2024, 09:28
Zitat:
Animal1.Create; // << Das funktioniert nicht. Animal1 wird überschrieben.
Natürlich, weil du hier den Constructor als Funktion/Methode aufrufst, auf einer bestehenden Objekt-Instanz.

Man benutzt zum Erstellen NIEMALS keine Variable, sondern immer den Typ.

ALSO
Delphi-Quellcode:
//Animal2 := Animal1.Create; {NEIN}
Animal2 := TAnimal.Create;
denn sowas will und sollte man, nach Möglichkeit, nicht machen:
Delphi-Quellcode:
Animal2 := TAnimal(TAnimal.NewInstance);
Animal2.Create;

Zitat:
Jetzt noch ClassType ...
Ja, Ob jun direkt den Klassentyp verwenden, oder über eine KlassenTyp-Varialbe (TClass) ... Hauptsache eine Klasse und nicht das Objekt.


Dass es dir das Objekt in Variable Animal1 überschrieben hat, ist korrekt.
Mehr Spaß hättest du mit Animal2 := Animal2.Create; , denn diese Variable war noch nicht initialisiert und es hätte hoffentlich eine schöne Exception gegeben.

Zitat:
Animal2 := TAnimalClass(Animal1.ClassType).Create;
Und nun nur nochmal aus Spaß, auch hier geht es mit getrennter Initialisierung/Speicherreservierung und nachträglichem Constructor.
Delphi-Quellcode:
Animal2 := TAnimal(Animal1.NewInstance);
Animal2.Create;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Jan 2024 um 09:37 Uhr)
  Mit Zitat antworten Zitat
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
29 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Constructor from Instance

  Alt 16. Jan 2024, 12:01
Animal2 := TAnimalClass(Animal1.ClassType).Create; Das funktioniert einwandfrei. Vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Constructor from Instance

  Alt 16. Jan 2024, 12:28
Animal2 := TAnimalClass(Animal1.ClassType).Create;
Will man den Constructor überschreiben, dann muß bei sowas natürlich spätestens in diesem Basistyp das als VIRTUAL (oder DYNAMIC) deklariert sein, und in den Nachfahren natürlich OVERRIDE.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
29 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Constructor from Instance

  Alt 16. Jan 2024, 19:25
Ja, das ist richtig.

uligerhardt hatte zwar geschrieben dass es auch ohne geht.

Das Allerdings nur bedingt und damit nicht richtig.
Man kann alle Felder benutzen aber der abgeleitete Constructor wird nicht aufgerufen.
Im Beispiel gab es keinen. Deswegen ist es nicht aufgefallen.
Virtueller und in abgeleiteter Klasse überschriebener Constructor und es funktionier einwandfrei.

Wenn man solche speziellen Sachen macht muss man natürlich noch mehr darauf achten, dass nachher alles wieder freigegeben wird.

Das war bei mir aber gegeben durch:

Delphi-Quellcode:
type
  TAnimalList = class(TObjectList<TAnimal>)
  public
    constructor Create; reintroduce;
  end;

constructor TAnimalList.Create;
begin
  inherited Create(true); //AOwnsObjects
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Constructor from Instance

  Alt 16. Jan 2024, 19:53
Bei der Liste muß es nicht sein,
aber wenn TDog und TCat einen eigenen Constructor haben sollen.

Wie bei den TComponent-Nachfahren, welche man auf die Form pappen kann und wo der DFM-Loader natürlich nur TComponent kennt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.166 Beiträge
 
Delphi 12 Athens
 
#7

AW: Constructor from Instance

  Alt 17. Jan 2024, 07:05
Animal2 := TAnimalClass(Animal1.ClassType).Create; Das funktioniert einwandfrei. Vielen Dank
Sorry, aber warum will man sowas überhaupt machen, mir fällt dazu kaum ein Use-Case ein.
Bestenfalls wäre ein duplizieren einer Instanz, wozu ich dann immer eine explizite Methode ".Clone" dafür anlegen würde, die auch was entsprechend vorbereiten kann.

Der einzige, mögliche Grund, der mit einfällt, könnte sein,
wenn man von einer geschlossenen 3rd-Party Library nur eine Instanz bekommt, aber keinen Zugriff auf die Klassendefinition oder SourceCodes hat.
Dann würde ich aber versuchen diese 3rd-Party Komponente so schnell wie möglich rauszuwerfen.

Bitte klärt mich auf, wenn dafür doch wichtige Anwendungen gibt.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Constructor from Instance

  Alt 17. Jan 2024, 08:37
Sorry, aber warum will man sowas überhaupt machen, mir fällt dazu kaum ein Use-Case ein.
Bestenfalls wäre ein duplizieren einer Instanz, wozu ich dann immer eine explizite Methode ".Clone" dafür anlegen würde, die auch was entsprechend vorbereiten kann.
Naja, in Delphi ist es ja üblich, in Klassenhierarchien eine Methode Assign zu haben. Dann kannst du Clone so implementieren:
Delphi-Quellcode:
function TAnimal.Clone: TAnimal;
begin
  Result := TAnimalClass(ClassType).Create;
  Result.Assign(Self);
end;
Uli Gerhardt
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.166 Beiträge
 
Delphi 12 Athens
 
#9

AW: Constructor from Instance

  Alt 17. Jan 2024, 09:59
Ja das ist klar.
Ich weiss aber nicht wofür man dies im wirklichen Leben brauchen könnte, außerhalb der Klasse.

Animal2 := TAnimalClass(Animal1.ClassType).Create;


So verstehe ich die Aufgabe von unten.
Animal2 := Animal1.Class.Create;

Geändert von Rollo62 (17. Jan 2024 um 10:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Constructor from Instance

  Alt 17. Jan 2024, 15:49
Ja das ist klar.
Ich weiss aber nicht wofür man dies im wirklichen Leben brauchen könnte, außerhalb der Klasse.

Animal2 := TAnimalClass(Animal1.ClassType).Create;


So verstehe ich die Aufgabe von unten.
Animal2 := Animal1.Class.Create;
Ich hab in unserem Code 6 Vorkommen von ClassType.*Create gefunden - 3 Clone-Methoden und 3 Verwendungen des Musters bei Third-Party-Klassen, wo wir keine Clone-Methode einbauen konnten (TGraphic z.B.).
Ist aber auch eine müßige Frage - ist halt eine Technik, die man bei Bedarf einsetzen kann.
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05: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