AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein class procedure aufrufen, wenn klasse zur designzeit noch nicht bekannt
Thema durchsuchen
Ansicht
Themen-Optionen

class procedure aufrufen, wenn klasse zur designzeit noch nicht bekannt

Ein Thema von hyype · begonnen am 19. Jan 2012 · letzter Beitrag vom 19. Jan 2012
Antwort Antwort
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

AW: class procedure aufrufen, wenn klasse zur designzeit noch nicht bekannt

  Alt 19. Jan 2012, 14:24
vielen dank für eure antworten.
interface geht wie schon gesagt wurde nicht mit class procedures/functions, hatte ich auch probiert
basisklasse mit abstrakter methode ist z.z. auch meine lösung für das problem
ich bin mir aber nicht sicher, ob das nicht irgendwann nachteilig sein könnte
so sieht es atm aus:
Delphi-Quellcode:
type

  TFBase = class(TObject)
  public
    class function Get_irgendwas: String; virtual; abstract;
  end;

  TF1 = class(TFBase)
    class function Get_irgendwas: String; override;
  end;

  TF2 = class(TFBase)
    class function Get_irgendwas: String; override;
  end;
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
  helper: TObject;
  z1: TF1;
  z2: TF2;
begin
  z1 := TF1.Create;
  z2 := TF2.Create;

  helper:= z1;

  FreeAndNil(z1);
  FreeAndNil(z2);

  Writeln((helper as TFBase).Get_irgendwas)
end;

{ TF2 }
class function TF2.Get_irgendwas: String;
begin
  result := 'tf2';
end;

{ TF1 }
class function TF1.Get_irgendwas: String;
begin
  result := 'tf1';
end;
jetzt noch eine frage: ich lasse die tobject-variable helper auf das objekt im speicher zeigen, auf das z1 zeigt. danach gebe ich z1 frei. dadurch müsste doch helper erstmal auf nix zeigen, aber auch nicht nil sein. dann caste ich helper als tfbase und er ruft die tf1.get_irgendwas methode auf.
da würde ich mich dafür interessieren, woher er noch weiß, dass es ein tf1-objekt ist und ob es eine schönere möglichkeit gibt, so ein objekt zu erzeugen ^^
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#2

AW: class procedure aufrufen, wenn klasse zur designzeit noch nicht bekannt

  Alt 19. Jan 2012, 14:58
da würde ich mich dafür interessieren, woher er noch weiß, dass es ein tf1-objekt ist und ob es eine schönere möglichkeit gibt, so ein objekt zu erzeugen ^^
Da hast du nur Glück, das zwischen FreeAndNil(z1); und Writeln((helper as TFBase).Get_irgendwas) der Speicherbereich, wo z1 mal lag, nicht überschrieben wird.
Besser so:
Delphi-Quellcode:
type
  TFBaseClass= class of TFBase;

...

var
  helper: TFBaseClass;

...

  helper:= TFBaseClass(z1.ClassType);

...

  Writeln(helper.Get_irgendwas);
Einbeliebigername.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.014 Beiträge
 
Delphi 2009 Professional
 
#3

AW: class procedure aufrufen, wenn klasse zur designzeit noch nicht bekannt

  Alt 19. Jan 2012, 15:10
    class function Get_irgendwas: String; virtual; abstract;
abstract habe ich früher auch gelegentlich verwendet - aber um die kryptische Fehlermeldung

"Abstrakter Fehler"

zu vermeiden, schreibe ich entweder eine Defaultimplementierung oder werfe eine aussagekräftige Exception.

Delphi-Quellcode:
class function TMyClass.Get_irgendwas: String;
begin
  raise Exception.Create('Bitte nicht vergessen, dass abstrakte Methoden überschrieben werden müssen. Danke!');
end;
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: class procedure aufrufen, wenn klasse zur designzeit noch nicht bekannt

  Alt 19. Jan 2012, 17:37
Wenn Emba die Delphi-Referenz durchsuchenAbstractErrorProc um die neue RTTI erweitern würde, indem dort der RTTI-Eintrag dieser Methode übergeben würde, dann gäbe es eine ideale Lösung.

Auch früher hätte man zumindestens den Klassennamen und den Index der VMT ausgeben können, denn diese Daten sind immer bekannt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Jan 2012 um 17:39 Uhr)
  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:03 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