Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Abstrakter Fehler bei Instanzenübergabe (https://www.delphipraxis.net/73556-abstrakter-fehler-bei-instanzenuebergabe.html)

faux 19. Jul 2006 20:04


Abstrakter Fehler bei Instanzenübergabe
 
Hallo!

Ich habe folgenden Code:
Delphi-Quellcode:
procedure Add(var List: TStrings);
begin
  List.Add('Value');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStrings;
begin
  List := TStrings.Create;
  Add(List);
  List.Free;
end;
Hier tritt in Zeile 3 ein Abstrakter Fehler auf. Aber wieso? :gruebel:
Könnte mir das jemand erklären und auch ev. eine Lösung des Problems posten?

Danke schon mal.
Grüße
Faux

mkinzler 19. Jul 2006 20:07

Re: Abstrakter Fehler bei Instanzenübergabe
 
Der Fehler liegt in Zeile 10: TStrings ist abstrakt müßte etwa so heißen:
Delphi-Quellcode:
List := TStringList.Create;

faux 19. Jul 2006 20:09

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von mkinzler
Der Fehler liegt in Zeile 10: TStrings ist abstrakt müßte etwa so heißen:
Delphi-Quellcode:
List := TStringList.Create;

Ah! Danke! Es funktioniert. :)

Grüße
Faux

Dax 19. Jul 2006 20:13

Re: Abstrakter Fehler bei Instanzenübergabe
 
Manche sehen es auch gern als Bug von Delphi an, überhaupt Instanzen mit abstrakten Methoden (mehr kann bei Delphi ja nicht abstrakt sein :mrgreen:) zu erlauben...

mkinzler 19. Jul 2006 20:17

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von Dax
Manche sehen es auch gern als Bug von Delphi an, überhaupt Instanzen mit abstrakten Methoden (mehr kann bei Delphi ja nicht abstrakt sein :mrgreen:) zu erlauben...

Was außer Methoden kann noch abstrakt sein? Aber du hast recht, eigentlich müßte der fehler schon beim Instantiieren kommen.

Khabarakh 19. Jul 2006 20:27

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von mkinzler
Zitat:

Zitat von Dax
Manche sehen es auch gern als Bug von Delphi an, überhaupt Instanzen mit abstrakten Methoden (mehr kann bei Delphi ja nicht abstrakt sein :mrgreen:) zu erlauben...

Was außer Methoden kann noch abstrakt sein?

Nun ja, eben ganze Klassen ;) . Soll heißen, solange mindestens eine Methode noch abstrakt ist, muss die gesamte Klasse als abstrakt gekennzeichnet werden (wie es bei vielen Sprachen der Fall ist). Dann würde auch schon der Compiler und nicht erst die Runtime einen Fehler melden.

PS: Einen Bug würde ich das nicht nennen, schließlich verhält es sich "As Designed". Bezeichnen wir es lieber als - ehm - kleine Designschwäche :mrgreen: .

mkinzler 19. Jul 2006 20:42

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Nun ja, eben ganze Klassen Wink .
Laut Theorie ist eine klasse abstrakt, wenn mindestens eine Methode abstrakt ist, daß ist klar. Delphi unterscheidet halt noch zwischen abstrakt und vollständig abstrakt. Von normalen abstrakte Klassen (Klassen mit nicht-abstrakten Methoden) lassen sich Intanzen bilden. Andere Sprachen verweigern dies.

Zitat:

Zitat von mkinzler
Was außer Methoden kann noch abstrakt sein?

bezog sich auf
Zitat:

(mehr kann bei Delphi ja nicht abstrakt sein Mr. Green)

Dax 19. Jul 2006 20:54

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von mkinzler
Was außer Methoden kann noch abstrakt sein?

Properties - wenn man von Delphi weggeht und sich zb. Chrome ankuckt. Dort gehen auch so nette Sachen wie
Delphi-Quellcode:
property Foo: string; read; abstract;

Ralf Kaiser 19. Jul 2006 21:00

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von Dax
Manche sehen es auch gern als Bug von Delphi an, überhaupt Instanzen mit abstrakten Methoden (mehr kann bei Delphi ja nicht abstrakt sein :mrgreen:) zu erlauben...

Hi,

reichen dir diese Warnungen nicht wenn du eine Instanz einer abstrakten Klasse erzeugst??

Code

Delphi-Quellcode:
procedure TForm1.Test;
var s: TStrings;
begin
  inherited;
  s := TStrings.Create;
end;
Was der Compiler dazu sagt:

Delphi-Quellcode:
[Warning] Form1.pas(43): W1020 Constructing instance of 'TStrings' containing abstract method 'TStrings.Get'
[Warning] Form1.pas(43): W1020 Constructing instance of 'TStrings' containing abstract method TStrings.GetCount'
[Warning] Form1.pas(43): W1020 Constructing instance of 'TStrings' containing abstract method 'TStrings.Clear'
[Warning] Form1.pas(43): W1020 Constructing instance of 'TStrings' containing abstract method 'TStrings.Delete'
[Warning] Form1.pas(43): W1020 Constructing instance of 'TStrings' containing abstract method 'TStrings.Insert'
Man sollte sich die Warnungen die der Compiler ausspuckt auch durchlesen und zu Herzen nehmen :-D

Ciao,
Ralf

Dax 19. Jul 2006 21:04

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von Alfi001
reichen dir diese Warnungen nicht wenn du eine Instanz einer abstrakten Klasse erzeugst??

Nö. Warnungen kann man ignorieren, Compilerfehler nicht ;)

Khabarakh 20. Jul 2006 13:22

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von mkinzler
Zitat:

Nun ja, eben ganze Klassen Wink .
Laut Theorie ist eine klasse abstrakt, wenn mindestens eine Methode abstrakt ist, daß ist klar. Delphi unterscheidet halt noch zwischen abstrakt und vollständig abstrakt. Von normalen abstrakte Klassen (Klassen mit nicht-abstrakten Methoden) lassen sich Intanzen bilden. Andere Sprachen verweigern dies.

Ich bezog mich auf die Kennzeichnung eines abstrakten Typs/Members, sonst wäre ja schon Dax' Aussage falsch gewesen, da es eben wie du sagst der Theorie nach auch in Delphi abstrakte Klassen gibt. Das abstract-Keyword wird aber (bislang und mit Win32) nur bei Methoden zugelassen.
Von deinen voll- und halbabstrakten Klassen habe ich aber noch nie etwas gehört :gruebel: .

mkinzler 20. Jul 2006 13:42

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Von deinen voll- und halbabstrakten Klassen habe ich aber noch nie etwas gehört Grübelnd... .
Gibt es auch nicht.
In der OOP-Theorie sind Klassen abstrakt, soweit sie eine abstrakte Methode besitzen. Man kann dann keine Instanzen davon bilden. In Delphi schon. Das wollte ich damit ausdrücken.

MaBuSE 20. Jul 2006 13:45

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von Dax
Zitat:

Zitat von mkinzler
Was außer Methoden kann noch abstrakt sein?

Properties - wenn man von Delphi weggeht und sich zb. Chrome ankuckt. Dort gehen auch so nette Sachen wie
Delphi-Quellcode:
property Foo: string; read; abstract;

Das kannst du doch (über Umwege) auch in Delphi machen:

Delphi-Quellcode:
type
  TMyDing = class(TObject)
  private
    { Private-Deklarationen }
    function GetDing: string; virtual; abstract;
    procedure SetDing(const Value: string); virtual; abstract;
  public
    { Public-Deklarationen }
    property Ding: string read GetDing write SetDing;
  end;
Damit muß in Nachfahre nur die Get und Set Methode implementiert werden und fertig.

Edit: OT: Das ist mein 1000. Beitrag

Khabarakh 20. Jul 2006 13:59

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Zitat von mkinzler
Zitat:

Von deinen voll- und halbabstrakten Klassen habe ich aber noch nie etwas gehört Grübelnd... .
Gibt es auch nicht.
In der OOP-Theorie sind Klassen abstrakt, soweit sie eine abstrakte Methode besitzen. Man kann dann keine Instanzen davon bilden. In Delphi schon. Das wollte ich damit ausdrücken.

Das hat aber nichts mit der Anzahl der nichtvirtuellen Methoden zu tun.
Auch in anderen Sprachen ist mir soetwas nicht bekannt, schließlich sind dort schon "halb-abstrakte Klassen" nicht mehr instanzierbar.
Zitat:

Delphi unterscheidet halt noch zwischen abstrakt und vollständig abstrakt. Von normalen abstrakte Klassen (Klassen mit nicht-abstrakten Methoden) lassen sich Intanzen bilden.
@Mabuse: Nichts anderes macht der Chrome-Compiler daraus ;) . Es ist also wirklich nur eine kleine Schreibersparniss, keine neue Form von abstrakten Membern.

mkinzler 20. Jul 2006 14:15

Re: Abstrakter Fehler bei Instanzenübergabe
 
Zitat:

Das hat aber nichts mit der Anzahl der nichtvirtuellen Methoden zu tun.
Ich dachte Delphi würde in diesem Fall ein Fehler ausgeben.
Ein Interface ist eine Art vollständig abstrakte Klasse ( ohne Attribute).


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 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