AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Generische Klasse - ich erhalte einen abstract Fehler...
Thema durchsuchen
Ansicht
Themen-Optionen

Generische Klasse - ich erhalte einen abstract Fehler...

Ein Thema von ADelph · begonnen am 13. Okt 2015 · letzter Beitrag vom 14. Okt 2015
Antwort Antwort
ADelph

Registriert seit: 10. Aug 2009
97 Beiträge
 
Delphi 10.4 Sydney
 
#1

Generische Klasse - ich erhalte einen abstract Fehler...

  Alt 13. Okt 2015, 11:57
Hallo,

ich versuche mich etwas intensiver mit generischen Klassen. Dazu habe ich mir folgendes Beispiel erstellt:

Delphi-Quellcode:
program MyProject;

{$R *.res}

uses
  System.SysUtils,
  System.Generics.Defaults,
  System.Generics.Collections,
  MyUnit in 'MyUnit.pas';

type
 TMyNewObj<T> = class(TMyObj<T>)
 private
  procedure MyUsedProc; virtual;
 end;

 TMyNew = class(TMyNewObj<double>)
// private
// procedure MyUsedProc; virtual;
 end;

var
 MyNewObj : TMyNew;

{ TMyNewObj<T> }

procedure TMyNewObj<T>.MyUsedProc;
begin
 writeln('Hello MyNewObj<T>');
 writeln(FValInt.ToString);
 readln;
end;

//{ TMyNew }
//
//procedure TMyNew.MyUsedProc;
//begin
// writeln('Hello MyNew');
// writeln(FValInt.ToString);
// writeln(Format('%0.2f',[FVal]));
// readln;
//end;

begin
 try
  { TODO -oUser -cConsole Main : Code hier einfügen }
  MyNewObj:=TMyNew.Create;
  MyNewObj.Val:=1.2345;
  MyNewObj.MyUseTheUsedProc; //<- Hier kommt der Fehler, bzw. ...siehe weiter unten...in MyUnit
 except
  on E: Exception do
   Writeln(E.ClassName, ': ', E.Message);
 end;
 FreeAndNil(MyNewObj);
end.
Delphi-Quellcode:
unit MyUnit;

interface
uses
  System.SysUtils,
  System.Generics.Defaults,
  System.Generics.Collections;

type
 TMyObj<T> = class(TObject)
 private
  FVal : T;
  FValInt : integer;
  procedure MyUsedProc; virtual; abstract;
 public
  procedure MyUseTheUsedProc;
  property Val: T read FVal write FVal;
 end;

implementation

{ TMyObj<T> }

procedure TMyObj<T>.MyUseTheUsedProc;
begin
 MyUsedProc; //Hier kommt der Fehler dann...
end;

end.
Wenn ich MyNewObj.MyUseTheUsedProc aufrufe erhalte ich die Meldung 'Abstracter Fehler'. Es wird also die in TMyNewObj Prozedur MyUsedProc nicht aufgerufen, sondern die ursprüngliche - und das verstehe ich im Augenblick nicht.

Wo denke ich da falsch? Ich würde das gern verstehen...aber vielleicht verstehe ich das Konzept der generischen Klassen etc. noch nicht richtig...

Auskommentiert habe ich meine weiteren Versuche, bzw. ich würde gern mit der Definition TMyNew arbeiten - aber das klappt auch nicht...

FVal und FValInt sind nur so zum Testen enthalten, damit 'etwas mehr' da ist. Dass ich mit dem Typ 'double' probiere ist auch nur so zum Testen da - hat keinen tieferen Sinn.
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Generische Klasse - ich erhalte einen abstract Fehler...

  Alt 13. Okt 2015, 12:38
Hi,
bei abgeleiteten Klassen solltest du eine virtuelle Procedure auch überschreiben. Siehe Beispiel unten. Dann müsste es eigentlich funktionieren.

Delphi-Quellcode:
type
  TMyNewObj<T> = class(TMyObj<T>)
  private
    procedure MyUsedProc; override; // <--- Ändere mal das virtual in override
  end;
  Mit Zitat antworten Zitat
ADelph

Registriert seit: 10. Aug 2009
97 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Generische Klasse - ich erhalte einen abstract Fehler...

  Alt 13. Okt 2015, 13:00
Hi,

...da kommt die Meldung:
[dcc32 Fehler] MyProject.dpr(14): E2137 Methode 'MyUsedProc' nicht in Basisklasse gefunden.

Liegt wohl daran, das MyUsedProd als 'abstract' definiert ist.
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#4

AW: Generische Klasse - ich erhalte einen abstract Fehler...

  Alt 13. Okt 2015, 13:13
MyUsedProc darf nicht private sein, sonst kann sie von der abgeleiteten Klasse nicht gesehen werden.
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
  Mit Zitat antworten Zitat
ADelph

Registriert seit: 10. Aug 2009
97 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Generische Klasse - ich erhalte einen abstract Fehler...

  Alt 13. Okt 2015, 14:00
...yo...public und override...wobei ich override nicht verstehe, denn es ist eine abstrakte Methode...

Danke für die Hinweise!
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Generische Klasse - ich erhalte einen abstract Fehler...

  Alt 13. Okt 2015, 14:54
Um genau zu sein, solltest du die Methode protected deklarieren (ausgehend davon, dass du sie ursprünglich private haben wolltest).

Warum verstehst du das override im Zusammenhang mit abstrakten Methoden nicht? Eine abstrakte Methode ist einfach eine Methode, die in der Basisklasse zwar deklariert, nicht aber implementiert wird.

Die Implementierung obliegt somit den abgeleiteten Klassen. Dass du explizit noch override angeben musst, ist in diesem Falle ganz normal. Dadurch weiß der Compiler, dass du tatsächlich die abstrakte Methode implementieren/überschreiben und nicht etwa verdecken willst.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 20:53 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