Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Abstract error bei Prozedur aus eigener Klasse


jeronimo - Do 21.07.11 18:05
Titel: Abstract error bei Prozedur aus eigener Klasse
Hiho,

kann mir jmd sagen wieso ich hier mit 'Abstract error' abgespeist werde?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
unit test;

interface

type
  BaseClass = class
  protected
    procedure ChildProc; virtualabstract;
  published
    procedure Go();
  end;

type
  ChildClass = class(BaseClass)
  published
    procedure ChildProc;
  end;

implementation

procedure BaseClass.Go();
begin
  Self.ChildProc()
end;

procedure ChildClass.ChildProc;
begin
  writeln('bla');
end;

end.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
program ptest;
{$APPTYPE CONSOLE}

uses
  SysUtils,
  test in 'test.pas';

var
  bla: ChildClass;

begin
  try
    bla := ChildClass.Create();
    bla.Go();

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.


Die Idee war es, eine Hauptklasse zu haben, von der die abgeleiteten Klassen sich teilweise anders verhalten, jedoch die gleiche Struktur haben, und auch immer gleich aufgerufen werden (daher das Go() in der Hauptklasse).

Vielen Dank und viele Grüsse,
Marki


glotzer - Do 21.07.11 18:13


Delphi-Quelltext
1:
2:
3:
4:
5:
type
  ChildClass = class(BaseClass)
  published
    procedure ChildProc; override;
  end;


und es sollte gehn


jeronimo - Do 21.07.11 18:18

Funzt,
aber versteh ich nicht ganz, denn die höhere Klasse ist eh abstrakt, von daher gibt's nix zu overriden...
Trotzdem *danke*


jaenicke - Do 21.07.11 18:33

Doch, eben die abstrakte Methode. Wenn du das nicht dazuschreibst, deklarierst du eine neue Methode ohne die der Elternklasse zu implementieren.

Du hast dann also immer noch eine abstrakte Methode in deiner Klasse und kannst ein solches Objekt deshalb nicht erzeugen.