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
Stefan1286b

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

Constructor from Instance

  Alt 15. Jan 2024, 07:55
Guten Tag.
Weiß jemand wie man einen Constructor von einer Instanz aufruft?
Zum verstehen eine Kleines Beispiel:
Code:
type
TAnimal = class
public
 Name:String;
end;

TDog = class(TAnimal)
public
Hairs:Integer;
end;

TCat = class(Tanimal)
public
Color:Integer;
end;




var
 Animal1,Animal2:TAnimal;
begin
 Animal1 := TDog.Create;

 //Some Code

 Animal2 := Animal1.Create; // << Das funktioniert nicht. Animal1 wird überschrieben.
 Animal2 := Animal1.Class.Create; // << Auch das funktioniert nicht. Wird dann ein TObject.
Die eigentliche Klasse ist von TPersistent abgeleitet und hat schon funktionstüchtig AssignTo mittels RTTI implementiert.

Und gelegentlich muss ich von einer Instanz erstellen.

Ich an folgendes gedacht:

Code:
type
TAnimal = class
public
 Name:String;
 procedure New:TAnimal; virtual; abstract;
end;

TDog = class(TAnimal)
public
Hairs:Integer;
procedure New:TAnimal; override;
end;

TCat = class(Tanimal)
public
Color:Integer;
procedure New:TAnimal; override;
end;

procedure TDogNew:TAnimal;
begin
 Result := TDog.Create;
end;


var
 Animal1,Animal2:TAnimal;
begin
 Animal1 := TDog.Create;

 //Some Code

 Animal2 := Animal1.New;
Aber denke das geht vielleicht auch einfacher.

Vielen Dank im vorraus.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: Constructor from Instance

  Alt 15. Jan 2024, 08:14
Als erstes würde ich TAnimal mal einen virtuellen Konstruktor verpassen.

Und die Variante mit Class müsste prinzipiell funktionieren, wenn du etwas ergänzt:
Delphi-Quellcode:
type
  TAnimalCLass = class of TAnimal; // Stichwort "Class reference" oder "Metaklasse"
Animal2 := TAnimalCLass(Animal1.Class).Create;
(freihändig hingetippt)
Uli Gerhardt

Geändert von uligerhardt (15. Jan 2024 um 08:17 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Constructor from Instance

  Alt 15. Jan 2024, 08:39
Jetzt noch ClassType statt Class und dann geht's!

Delphi-Quellcode:
type
    TAnimal = class
    public
        Name: String;
    end;

    TDog = class(TAnimal)
    public
        Hairs: Integer;
    end;

    TCat = class(TAnimal)
    public
        Color: Integer;
    end;

    TAnimalClass = class of TAnimal;

var
    Animal1, Animal2: TAnimal;

begin

    try
        Animal1 := TDog.Create;

        Animal2 := TAnimalClass(Animal1.ClassType).Create;
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: Constructor from Instance

  Alt 15. Jan 2024, 08: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.313 Beiträge
 
Delphi 12 Athens
 
#5

AW: Constructor from Instance

  Alt 15. Jan 2024, 10: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 10:37 Uhr)
  Mit Zitat antworten Zitat
Stefan1286b

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

AW: Constructor from Instance

  Alt 16. Jan 2024, 13:01
Animal2 := TAnimalClass(Animal1.ClassType).Create; Das funktioniert einwandfrei. Vielen Dank
  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 00:15 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 by Thomas Breitkreuz