Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abstrakter Fehler (https://www.delphipraxis.net/56461-abstrakter-fehler.html)

DGL-luke 6. Nov 2005 09:26


Abstrakter Fehler
 
Delphi-Quellcode:
type TBitOPer = class(TObject)
   BoolMap: TBoolMap;
   constructor Create(InitMap:TBoolMap);
   destructor Destroy; override;
 public
   procedure Add(map: TBoolMap);
   function Get: TBoolMap;
 protected
   function Perform(a,b:boolean):boolean; virtual; abstract;
end;

type TXORer = class(TBitOPer)
  private
    function Perform(a,b:boolean):boolean; inline;
end;

type TORer = class(TBitOPer)
  private
    function Perform(a,b:boolean):boolean; inline;
end;
Ich hab hier eine abstrakte Basisklasse, in den beiden Nachfahren wird dann perform() implementiert.
Rufe ich das jedoch in einer Instanz auf (add ruft perform auf), bekomme ich einen "abstrakten Fehler". was muss ich ändern? Kann ich das inline halten?

mirage228 6. Nov 2005 09:29

Re: Abstrakter Fehler
 
Hi,

Da fehlt das override hinter der Deklaration von perform() in den Ableitungen.

Du wirst auch wahrscheinlich eine Warnung erhalten, weil perform() in den Unterklassen eine geringere Sichtbarkeit hat - solltest die Prozedur demnach also auch nach "protected" packen.

mfG
mirage228

DGL-luke 6. Nov 2005 09:38

Re: Abstrakter Fehler
 
OK. override verbietet aber inline :(

Und wieso ist public eine gernigere Sichtbarkeit als protected? protected heisst doch "nur von Nachfahren sichtbar" und public "von allen sichtbar"?!

mirage228 6. Nov 2005 09:39

Re: Abstrakter Fehler
 
Zitat:

Zitat von DGL-luke
Und wieso ist public eine gernigere Sichtbarkeit als protected? protected heisst doch "nur von Nachfahren sichtbar" und public "von allen sichtbar"?!

Delphi-Quellcode:
type TXORer = class(TBitOPer)
  private
    function Perform(a,b:boolean):boolean; inline;
end;

type TORer = class(TBitOPer)
  private
    function Perform(a,b:boolean):boolean; inline;
end;
Also ich lese da "private" :mrgreen:

mfG
mirage228

Der_Unwissende 6. Nov 2005 09:41

Re: Abstrakter Fehler
 
Zudem ist inline seit mindestens Delphi 7 als veraltet markiert. Du solltest lieber in der Methode asm benutzen.

Was die Sichtbarkeit angeht, so muss die Überschriebene Funktion mindestens Protected sein, da du die Sichtbarkeit (soweit ich weiß auch in Delphi) nicht vermindern kannst! Also musst du gleiche oder höhere Sichtbarkeit zulassen. private ist aber weniger als protected

Gruß Der Unwissende

mirage228 6. Nov 2005 09:45

Re: Abstrakter Fehler
 
Zitat:

Zitat von Der_Unwissende
Zudem ist inline seit mindestens Delphi 7 als veraltet markiert. Du solltest lieber in der Methode asm benutzen.

Hi,

seit Delphi 2005 kann "inline" für Funktions-inlining benutzt werden, das heisst, dass die Funktion nicht mehr aufgerufen, sondern direkt an die Stelle des aufrufs gesetzt wird. Das spart den Aufruf.

Delphi-Referenz durchsucheninline-Direktive
Zitat:

Zitat von OH
Beim Delphi-Compiler ermöglicht zur Verbesserung der Leistung, Funktionen und Prozeduren mit der Direktive inline zu versehen. Wenn eine Funktion oder Prozedur bestimmten Kriterien entspricht, fügt der Compiler Code direkt ein anstatt einen Aufruf zu generieren. Das Ergebnis dieser Leistungsoptimierung ist schnellerer Code, der jedoch mehr Speicherplatz in Anspruch nimmt. Der Compiler produziert dabei eine größere Binärdatei. Die Direktive inline wird in Funktions- und Prozedurdeklarationen und -definitionen, genau wie andere Direktiven, verwendet.

Also die Direktive ist keineswegs veraltet...

mfG
mirage228

DGL-luke 6. Nov 2005 09:47

Re: Abstrakter Fehler
 
ach so... äh ja.... :oops:

Robert_G 6. Nov 2005 09:48

Re: Abstrakter Fehler
 
Ist das denn wirklich sooo schwer zu verstehen? :gruebel:
Kiek mal hier, das sollte zusammen mit Davids nett gemeintem OH Copy'nWaste eigentlich alles sagen...

Der_Unwissende 6. Nov 2005 11:24

Re: Abstrakter Fehler
 
Sorry, dann bin ich wohl etwas zu wenig davon ausgegangen, dass Borland Tags wiederbelebt. Finde ich aber auch etwas ungewöhnlich, aber gut.
Ok, schau mir das nächste mal wohl lieber 2005 an, bevor ich hier etwas sage.

Robert_G 6. Nov 2005 11:48

Re: Abstrakter Fehler
 
Zitat:

Zitat von Der_Unwissende
Sorry, dann bin ich wohl etwas zu wenig davon ausgegangen, dass Borland Tags wiederbelebt. Finde ich aber auch etwas ungewöhnlich, aber gut.
Ok, schau mir das nächste mal wohl lieber 2005 an, bevor ich hier etwas sage.

Ich meinte doch gar nicht dich! :shock:

Ich verstehe nur ncht, wie man nach so langer Zeit mit Delphi nicht weiß was virtual und override machen und warum inline damit nicht klarkommen kann. (deterministischer statischer compile vs. dyn. gebundenem virtual call)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 Uhr.
Seite 1 von 2  1 2      

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