Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Vererbung von Methoden


Bienenelf - Sa 17.03.12 03:41
Titel: Vererbung von Methoden
Guten Abend Programmierer,

ich bin ein Programmier Neuling ( Verstehe nur die Grundlagen) und habe deswegen eine Frage.
Ich habe mir zu dem Thema auch ein Buch gekauft und einige pdfs mir durchgelesen, aber werde aus den Dingern auch nicht schlauer für meine Problematik.

Ich habe eine Basisklasse


Delphi-Quelltext
1:
Type TFileSemAuto = class(TObject)                    

und eine abgeleitete Klasse

Delphi-Quelltext
1:
type TDigitImageProcess = class(TFileSemAuto)                    

Nun habe ich in meine TFileSemAuto eine Methode um Fehler zu überprüfen, wie Bsp.: ob die Datei existiert etc. In dieser Function soll dann ein MessageBox aus einer Case Anweisung aufgerufen werden.

Delphi-Quelltext
1:
function DefectReportCheck( const Value:ShortInt):Integer; virtual;                    

Es können aber auch in meiner TDigitImageProcess Klasse Fehler entstehen.
Aus diesem Grund habe ich die Funktion virtual erstellt und sie dann nochmals in meiner TDigitImageProcess aufgerufen function DefectReportCheck( const Value:ShortInt):Integer; override;

In der Basisklasse habe ich einen ganz einfachen Code geschrieben (Case, if then else). Den identischen Code habe benötige ich auch in meiner abgeleiteten Klasse, plus das inherited damit er auch nach den anderen Fehlern überprüft.
und so sieht der Code aus in der abgeleiteten Klasse:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
var Temp:Boolean;
begin
begin
  Case Value of
  4:  begin
        Case Application.MessageBox(PChar(Failur4+#13+Information2),
             PChar(Failur4),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  5:  begin
        Case Application.MessageBox(PChar(Failur5+#13+Information2),
             PChar(Failur5),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  else
    inherited DefectReportCheck(Value);
  end;
end;

Identisch sieht auch der Code in der Basisklasse aus:

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:
begin
  Case Value of
  1:  begin
        Case Application.MessageBox(PChar(Failur1+#13+Information1),
             PChar(Failur1), 17of
          IDOK: FErrorHandel:=1;
          IDCANCEL: FErrorHandel:=0;
        end;
      end;
  2:  begin
        Case Application.MessageBox(PChar(Failur2+#13+Information1),
             PChar(Failur2), 17of
          IDOK: FErrorHandel:=1;
          IDCANCEL: FErrorHandel:=0;
        end;
      end;
  3:  begin
        Case Application.MessageBox(PChar(Failur3+#13+Information1),
             PChar(Failur3), 17of
          IDOK: FErrorHandel:=1;
          IDCANCEL: FErrorHandel:=0;
        end;
      end;
  end;
end;


Das sind die Codes, jetzt mein Problem:

Nun will ich den Code aus meiner Basisklasse aufrufen und mir den Wert Rückgeben lassen,
aber dieser wird ja durch die abgeleitete Klasse wieder überschrieben. Weil er am Ende der Bearbeitung nochmals in die abgeleitete Klasse anfängt und mir dann kein Wert übergibt.
Kann mir jemand da Helfen?

gruß Bienenelf

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt


Bergmann89 - Sa 17.03.12 07:48

Hey,

also sofern ich dich richtig verstanden habe:

Delphi-Quelltext
1:
result := inherited DefectReportCheck(Value);                    

ansonsten:
lass das virtual weg und caste auf die Basisklasse:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var 
  test: TDigitImageProcess;
  returnCode: Integer;


test := TDigitImageProcess.Create;
try
  returnCode := (test as TFileSemAuto).DefectReportCheck(0); //zugriff auf die Methode der Basisklasse
finally
  test.Free;
end;


MfG Bergmann.


Tranx - Sa 17.03.12 11:33

Hallo,

Versuche mal das. Definition einer lokalen Variablen in der abgeleiteten Klasse (s.o.) und dann Übergabe des Ergebnisses des Inherited Aufrufs an diese lokale Variable. Dann brauchst Du m.E. gar nichts an den Definitionen zu ändern. Und gleich auch noch vielleicht das Ganze aus dem Else-Zweig herausnehmen, damit die inherited-Methode überhaupt aufgerufen wird, falls nicht schon in der abgeleiteten Methode ein Case-Fall zutrifft.

Viel Erfolg

Gunther


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:
32:
33:
type TDigitImageProcess = class(TFileSemAuto)

  ErgBasisDefectReport : integer;


function DefectReportCheck( const Value:ShortInt):Integer; virtual;
 
  
:
:

function TDigitImageProcess.DefectReportCheck( const Value:ShortInt):Integer; virtual;

var Temp:Boolean;
begin
  Case Value of
  4:  begin
        Case Application.MessageBox(PChar(Failur4+#13+Information2),
             PChar(Failur4),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  5:  begin
        Case Application.MessageBox(PChar(Failur5+#13+Information2),
             PChar(Failur5),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  end;
  ErgBasisDefectReport := inherited DefectReportCheck(Value);
end;


Bergmann89 - So 18.03.12 14:23

Hey,

so hat die Funktion aber unter Umständen einen undefinierten Rückgabewert. Wenn ich eine Funktion definiere, dann will ich da auch was zurück bekommen, also warum es so umständlich machen un den Wert erst in einer Varible zwischenspeichern, wenn ich es auch gleich als Ergebnis zurück geben kann?!

MfG Bergmann.


Bienenelf - Fr 23.03.12 19:45

Danke hatte geklappt, habe das alles noch was umgeschrieben damit ich kein undefinierten Zustand habe.
Ich wusste nicht, dass man das mit inherited machen kann: result:= inherited(xyz)

nun bin ich ein schritt schlauer und bedanke mich bei euch... :)

gruß
Bienenelf...