Abstrakte Klassen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Abstrakte Klassen

Beitrag von m.fuchs »

Hallo,

ich bin gerade etwas verwirrt was die Thematik "abstrakte Klassen" angeht. Ich habe folgendes Programm:

Code: Alles auswählen

program AbstractTest;
{$MODE ObjFpc}
{$H+}
 
uses Classes;
 
type
  TAbstractClass = class abstract(TObject)
  end;
 
var
  MyAbstractClass: TAbstractClass = nil;
 
begin
  MyAbstractClass := TAbstractClass.Create;
  MyAbstractClass.Free;
end.
Meinem Empfinden nach, sollte der Compiler die direkte Nutzung einer abstrakten Klasse mit einem Fehler beantworten. Aber es passiert nichts, nicht einmal eine Warnung.

Müssen dafür noch irgendwelche Compilereinstellungen gesetzt werden? Mache ich irgendetwas falsch?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Abstrakte Klassen

Beitrag von Heinrich Wolf »

Code: Alles auswählen

type
  TAbstractClass = class abstract(TObject)
  end;
Das ist keine abstrakte Klasse.

Code: Alles auswählen

type
  TAbstractClass = class(TObject)
  public
    procedure Method; virtual; abstract;
  end;
Das ist eine abstrakte Klasse. Eine Prozedurbody zu Method gibt es hierbei nicht. var AbstractClass : TAbstractClass; oder TAbstractClass.Create wird dabei schon mit einem Fehler quittiert. Das Ganze dient als Vorlage zu einer weiteren Klasse.

Code: Alles auswählen

type
  TMyClass = class(TAbstractClass)
  public
    procedure Method; override;
  end;
 
procedure TMyClass.Method;
  begin
  end;
 
Ein praktisches Beispiel? Hier bitte: Ich hab eine abstrakte QuickSort Klasse tSort in meiner Unit WolfUtil.pas erstellt. Die hat eine Methode Sort() mit dem Body des QuickSort Algorithmus. Außerdem hat sie die Methoden Compare() und Swap(), die beide abstract sind. Darauf baut eine Unit SortGrid.pas auf mit den Klassen TGridSort und TSortGrid. Dort ist definiert, wie die Zeilen eines TStringGrid verglichen und geswapt werden. Das ganze ist zu finden unter http://www.Wolf-Fuerth.de/sortgrid.zip und enthält auch ein Demo Projekt mit sortierfähigem TStringGrid. Ich verwende diesen Code selbst in den Projekten CalPrint (http://www.Wolf-Fuerth.de/calprint.src.zip, Delphi, Lazarus, Windows, Linux), TreeComp (http://www.Wolf-Fuerth.de/treecomp.zip, Delphi ohne Quellcode) usw.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Abstrakte Klassen

Beitrag von theo »

m.fuchs hat geschrieben: Müssen dafür noch irgendwelche Compilereinstellungen gesetzt werden? Mache ich irgendetwas falsch?
Ich glaube, Delphi lässt das auch zu. Scheint irgendwie halbherzig, das Feature.
http://qc.embarcadero.com/wc/qcmain.aspx?d=24662

TStrings ist z.B. eine echt abstrakte Klasse in der RTL.
Wenn du das machst:

Code: Alles auswählen

 
AStr:=TStrings.Create;  
bekommst du einige Warnungen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Abstrakte Klassen

Beitrag von m.fuchs »

Genau, dass ich Warnungen bekomme wenn eine oder mehrere Methoden einer Klasse abstrakt sind, weiß ich schon. Das funktioniert auch.
Nun wäre es aber sinnvoll, dass ein Erzeugen einer "komplett abstrakten" Klasse gar nicht möglich ist.

Aber wenn Delphi das schon falsch macht...


Andererseits, sollte ich dann nicht wenigstens Warnungen bekommen, wenn die Klasse als abstract definiert ist?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Abstrakte Klassen

Beitrag von theo »

m.fuchs hat geschrieben: Andererseits, sollte ich dann nicht wenigstens Warnungen bekommen, wenn die Klasse als abstract definiert ist?
Wie gesagt: Halbherzig aus Delphi.NET übernommen und FPC hat es wahsch. auch übernommen, damit Delphi Sourcen kompilieren.
Imho am besten vergessen, das Feature.

Antworten