AGB  ·  Datenschutz  ·  Impressum  







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

Mehrere Klassen von einer Klasse ableiten

Ein Thema von gargano · begonnen am 27. Apr 2012 · letzter Beitrag vom 30. Apr 2012
Antwort Antwort
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: Mehrere Klassen von einer Klasse ableiten

  Alt 27. Apr 2012, 17:48
Hallo DeddyH,
danke für die Antwort.
Bleibt das Problem, daß ich den Klassentyp von AObject nicht weiß , da der Typ ja in der Bpl enthalten ist und diese erst zur Laufzeit geladen wird.

Kann ich den Typ zur Laufzeit ermitteln ?
Wie wäre dann der Aufruf von TMain.DoSomething(AObject:TBaseClass) ?

mkinzler :
Von Interfaces habe ich gelesen, daß diese mit Memoryleaks Probleme haben....
Die Applikation steuert verschiedene Analysengeräte und darf nicht ausfallen.

Gruß
Gargano
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#2

AW: Mehrere Klassen von einer Klasse ableiten

  Alt 27. Apr 2012, 20:25
Du kannst den Typ schon zur Laufzeit ermitteln (if Dings is TBums), aber wozu? Dadurch, dass Du die Basisklasse als Datentyp übergibst (und dann ein Objekt einer davon abgeleiteten), kannst Du Dir sicher sein, dass das Objekt die richtige Methode ausführt. Zumindest, solange diese Methode überschrieben (override) wurde und nicht verdeckt. Möglicherweise verstehe ich Dich aber auch falsch.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Mehrere Klassen von einer Klasse ableiten

  Alt 27. Apr 2012, 20:54
Sprecht doch mal in ganzen Sätzen mit dem TE

Klassendefinition:
Delphi-Quellcode:
unit DeviceUnit;

interface

type
  TBaseDevice = class
    procedure InitDevice; virtual; abstract;
  end;

  TMainDevice = class( TBaseDevice )
    procedure InitDevice; override;
  end;

  TSubDevice = class( TBaseDevice )
    procedure InitDevice; override;
  end;

implementation

procedure TMainDevice.InitDevice;
begin
  ShowMessage('MainDevice initialisiert');
end;
  
procedure TSubDevice.InitDevice;
begin
  ShowMessage('SubDevice initialisiert');
end;

end.
Benutzung:
Delphi-Quellcode:
uses
  DeviceUnit;

procedure DoSomething( aDevice : TBaseDevice );
begin
  aDevice.InitDevice;
end;

procedure Test1;
var
  MyMainDevice : TMainDevice;
  MySubDevice : TSubDevice;
begin
  MyMainDevice := TMainDevice.Create;
  try
    DoSomething( MyMainDevice ); // -> MsgBox mit 'MainDevice initialisiert'
  finally
    MyMainDevice.Free;
  end;

  MySubDevice := TSubDevice.Create;
  try
    DoSomething( MySubDevice ); // -> MsgBox mit 'SubDevice initialisiert'
  finally
    MySubDevice.Free;
  end;
end;

procedure Test2;
var
  MyDevice : TBaseDevice;
begin
  MyDevice := TMainDevice.Create;
  try
    DoSomething( MyDevice ); // -> MsgBox mit 'MainDevice initialisiert'
  finally
    MyDevice.Free;
  end;

  MyDevice := TSubDevice.Create;
  try
    DoSomething( MyDevice ); // -> MsgBox mit 'SubDevice initialisiert'
  finally
    MyDevice.Free;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Mehrere Klassen von einer Klasse ableiten

  Alt 28. Apr 2012, 08:29
Hallo zusammen,

danke für die Antwort und das Beispiel.
Allerdings hat dies einen Haken: Man muß beim Kompilieren den Klassentyp kennen , hier den TMainDevice oder TSubDevice.
Nur die Klassen sind im Hauptprogramm nicht bekannt beim Kompilieren.

Nochmal zur Erklärung :
Es werden Devicemodule entwickelt, die zur Laufzeit dynamisch als bpl geladen werden (Pro Devicemodule eine Bpl) . Die Klassen in dieser bpl sind aber dem Hauptprogramm zum Zeitpunkt der Kompilierung nicht bekannt.
Also angenommen, man definiert ein neues Devicemodule mit TXDevice als Klasse. TXDevice ist in einer bpl eingebunden.
Zur Laufzeit wird die Bpl dynamisch geladen.
Welche bpl geladen wird ist in einem Ascii File eingetragen, der die Namen der bpl's enthält.
Dies geschieht alles ohne das Hauptprogramm neu zu kompilieren.

Wie kann ich nun in dem untenstehenden Beispiel TXDevice erzeugen ?
Wie kann ich also eine Klasse erzeugen, wenn ich diese nicht kenne ?

Oder sollte man hier ganz anders vorgehen ?

In dem untenstehenden Beispiel wäre dies dann so,wenn man bei abstraken Methoden bleibt :
Delphi-Quellcode:
procedure Test2;
var
  MyDevice : TBaseDevice;
begin
// TMainDevice ist hier nicht bekannt, es kann auch TXDevice
// sein oder anders.

  MyDevice := TMainDevice.Create;
  try
    DoSomething( MyDevice ); // -> MsgBox mit 'MainDevice initialisiert'
  finally
    MyDevice.Free;
  end;
Gruß
Gargano
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Mehrere Klassen von einer Klasse ableiten

  Alt 28. Apr 2012, 08:46
Wie kann ich also eine Klasse erzeugen, wenn ich diese nicht kenne ?
Deine Klasssen müssen sich im initialization Abschnitt mit Hier im Forum suchenRegisterClass() bekanntmachen.
Dann kannst du später mit Hier im Forum suchenFindClass() die Klasse finden und daraus neue Objekte erzeugen.
  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 03:04 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