Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Weiterentwickelndes Object??? (https://www.delphipraxis.net/41711-weiterentwickelndes-object.html)

Kedariodakon 7. Mär 2005 14:57


Weiterentwickelndes Object???
 
Ich hätte da mal wieder so eine kleine Frage :mrgreen:

Ist es möglich, dass sich ein Object selber weiterentwickelt, oder besser selbstständig upgradet?

Angenommen ich habe eine Klasse TTestyBase = Class mit einer Procedure Readstring...
Ist es nun möglich, dass sich das Object durch diese Procedure in eines von ihm Abgeleiteten Klassen wandelt?
z.B.:
Ist im String ein Integer, dann in die Klasse TTestyInteger = Class( TTestyBase )
oder es ist im String ein Float, dann in die Klasse TTestyFloat = Class( TTestyBase )

Geht sowas?
Ohne das ich jetzt noch eine Klasse benötige, die die Sache Händelt? :gruebel:

Bye

uschi 7. Mär 2005 15:03

Re: Weiterentwickelndes Object???
 
AI - künstliche Intelligenz

Kedariodakon 7. Mär 2005 15:06

Re: Weiterentwickelndes Object???
 
Zitat:

Zitat von uschi
AI - künstliche Intelligenz

Wenns sowas gibt, bräcuhte ich keine Programme mehr schreiben, dann würd ich schreiben lassen... :zwinker:

OK Spass beiseite, dass hilft mir nicht wirklich weiter...

Bye

shmia 7. Mär 2005 15:15

Re: Weiterentwickelndes Object???
 
Zitat:

Zitat von Kedariodakon
Ist es möglich, dass sich ein Object selber weiterentwickelt, oder besser selbstständig upgradet?

Angenommen ich habe eine Klasse TTestyBase = Class mit einer Procedure Readstring...
Ist es nun möglich, dass sich das Object durch diese Procedure in eines von ihm Abgeleiteten Klassen wandelt?
z.B.:
Ist im String ein Integer, dann in die Klasse TTestyInteger = Class( TTestyBase )
oder es ist im String ein Float, dann in die Klasse TTestyFloat = Class( TTestyBase )

Geht sowas?
Ohne das ich jetzt noch eine Klasse benötige, die die Sache Händelt? :gruebel:

Ich sach mal das geht nicht.
Beim Erzeugen eines Objekts muss die Klasse schon feststehen.
Mit undokumentierten Tricks kann man nachträglich die Klasse eines Objekts verändern; das ist
aber absolut nicht zu empfehlen.
Du kannst allerdings eine Factory-Klasse benützen, um deine Objekte zu erzeugen.
Die Verwendung einer Factory-Klasse mag im 1. Augenblick umständlich erscheinen, ist aber das Mittel der Wahl.

Oxmyx 7. Mär 2005 15:23

Re: Weiterentwickelndes Object???
 
Also das ganze ist schon prinzipiell möglich.

Delphi-Quellcode:
type
  Base = class
    procedure Convert;
  end;

  Derived = class(Base)
    procedure Message;
  end;

{...}

procedure Base.Convert;
begin
  Self.Destroy;
  Self := Derived.Create;
end;

procedure Derived.Message;
begin
  ShowMessage('Hat funktioniert.');
end;

{...}

var
  C: Base;
begin
  C := Base.Create;
  C.Convert;

  if (C is Derived) then (C as Derived).Message;
end;

Kedariodakon 7. Mär 2005 15:26

Re: Weiterentwickelndes Object???
 
Zitat:

Zitat von shmia
Beim Erzeugen eines Objekts muss die Klasse schon feststehen.

Die TTestyBase Klasse wüßte in der Procedure ReadString, dass es die anderen Klassen gibt, dass ist klar, Sie soll ja nur die Umwandlung machen wenn Sie sich 100% sicher ist!

Zitat:

Zitat von shmia
Mit undokumentierten Tricks kann man nachträglich die Klasse eines Objekts verändern; das ist
aber absolut nicht zu empfehlen.

Hmm da sie ja undokumentiert sind, werd ich sie wohl nicht finden :zwinker:

Zitat:

Zitat von shmia
Du kannst allerdings eine Factory-Klasse benützen, um deine Objekte zu erzeugen.
Die Verwendung einer Factory-Klasse mag im 1. Augenblick umständlich erscheinen, ist aber das Mittel der Wahl.

Hmm ka was das ist, über das Ding muss ich mich erst mal schlau machen :coder:

Edit: Finde in dem Zusammenhang nur was mit Web-Diensten :?: :?: :?:

Sonst noch wer Ideen :hi:

Bye

Oxmyx 7. Mär 2005 15:35

Re: Weiterentwickelndes Object???
 
Nach meiner Methode würde es gehen. Du musst halt bei jeder Verwendung abfragen, um welche Art von Objekt es sich handelt.

jim_raynor 7. Mär 2005 15:39

Re: Weiterentwickelndes Object???
 
Zitat:

Zitat von Oxmyx
Nach meiner Methode würde es gehen. Du musst halt bei jeder Verwendung abfragen, um welche Art von Objekt es sich handelt.

Aber die bereits vorhandenen Daten gehen verloren. Nur als Erinnerungen, falls es nicht so gewollt ist :)

Stevie 7. Mär 2005 15:45

Re: Weiterentwickelndes Object???
 
Möchtest du dein TTestyBase-Objekt schon mit Daten ein Properties bestücken oder dient es nur der Erzeugung eines von ihm abgeleiteten Objekts?
Ansonsten könntest du das ganze mit virtuellen Methoden machen...

Delphi-Quellcode:
interface

TTestyBase = class
  function SagWas: string; virtual; abstract;
end;

TTestyFloat = class(TTestyBase)
  function SagWas: string;
end;

TTestyInteger = class(TTestyBase);
  function SagWas: string;
end;

function CreateObject(ClassType :string): TTestyBase;

{...}

implementation

function TTestyFloat.SagWas: string;
begin
  Result := 'Ich bin ein TTestyFloat-Objekt';
end;

function TTestyInteger.SagWas: string;
begin
  Result := 'Ich bin ein TTestyInteger-Objekt';
end;

function CreateObject(ClassType :string): TTestyBase;
begin
  Result := nil;
  if ClassType = 'Integer' then
  begin
    Result := TTestyInteger.Create;
    Exit;
  end;
  if ClassType = 'Float' then
  begin
    Result := TTestyFloat.Create;
    Exit;
  end;
end;

{...}

procedure Test;
begin
  with CreateObject('Integer') do
  begin
    ShowMessage(SagWas);
    Free;
  end;
  with CreateObject('Float') do
  begin
    ShowMessage(SagWas);
    Free;
  end;
end;

Kedariodakon 7. Mär 2005 16:12

Re: Weiterentwickelndes Object???
 
Zitat:

Zitat von Stevie
Möchtest du dein TTestyBase-Objekt schon mit Daten ein Properties bestücken oder dient es nur der Erzeugung eines von ihm abgeleiteten Objekts?
Ansonsten könntest du das ganze mit virtuellen Methoden machen...

Also die BasisKlasse hat viele Virtuelle, Abstracte Methoden, welche vielerlei Informationen zur Verfügung stellen, einlesen speichern...
Eingelesen wird immer im selben verfahren, mit 2 Strings: TypString, InformationsString.

Bis jetzt mach mit mach ich es mit Hilfe eines 2.ten Objects.
Dies macht eine Fallunterscheidung (anhand des Typ-Strings) und Erstellet dementsprechend das Object, welches den zweiten String (InformationsString) zerlegt und daraus die Informationen bereitstellt...

Abrufen tu ich die Informationen aber immer mit dem BasisObject mit den Abstrakten Virtuellen Methoden...

Da die Erstellung nun aber zunehmend unübersichtlicher wird, wollte ich gleich die Erstellung der Objecte dem Object selber überlassen, auch deswegen, da ich an vielen stellen die Liste mit den BasisObjecten fülle und da immer ein Object zum Handeln zu erstellen is mir auf dauer zu blöd :angel2:

Edit: Fast vergessen, dass BasisObject hat natürlich auch Propertys, die aber schon befüllt sind, auch müssen, weil sonst findet es die Strings auch nicht :zwinker: ...
irgendwie total verworren, ich glaub ich konsilidiere das ganze mal...

Bye


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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