Autor |
Beitrag |
Moony
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Do 12.05.05 16:04
Ich hab das Problem: Ich zitiere: [Fehler] mTSpurKugel.pas(12): Eine statische Methode kann nicht überschrieben werden. Also wie ich die Vererbung verstanden habe: Der erbende Klasse muss gesagt werden von wem sie erbt. Will ich einige Methoden ändern, so muss in der Oberklasse hinter die Betreffenen virtual und in der Unterklasse override. Jetzt bekomm ich aber den Fehler. (2x weil ich 2Methoden überschreiben will) Es handelt sich bei dem Programm um ein mehr oder weniger (eher weniger) realistisches Billardspiel.
Im Programm siehts wie folgt aus.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| unit mTKugel; (Oberklasse) private ... und so weiter public constructor init (pPosX, pPosY, pRadius, pRichtung, pGeschwindigkeit : double); virtual; procedure loescheDich ( ); virtual; ... und so weiter |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| unit mTSpurKugel; (Unterklasse) interface uses mSuM,mTTisch,mTKugel; type TSpurKugel = CLASS (TKugel) public hatBuntstift : Buntstift; constructor init (pPosX, pPosY, pRadius, pRichtung : double); override; procedure loescheDich ( ); override; end; ..und so weiter |
Wahrscheinlich bin ich einfach nur zu sehr auf den Fehler eingeschossen, dass ich den Wald vor Bäumen nicht sehe. Hoffe ihr könnt mir helfen
Moderiert von Christian S.: Delphi-Tags hinzugefügt.
Moderiert von Christian S.: Topic aus VCL (Visual Component Library) verschoben am Do 12.05.2005 um 16:25
|
|
opfer.der.genauigkeit
      
Beiträge: 754
Erhaltene Danke: 1
|
Verfasst: Do 12.05.05 16:20
Auf den ersten Blick sieht das OK aus.
Zeig mal den Rest 
_________________ Stellen Sie sich bitte Zirkusmusik vor.
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Do 12.05.05 23:22
Moin!
Die Parameterliste im Init bzw. Constructor hat sich geändert, daher die Frage ob du den Originalen verdecken willst oder einen zusätzlichen implementieren willst?
MfG
Muetze1
_________________ 49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
|
|
iX0r
      
Beiträge: 34
Ubuntu
D6, Lazarus
|
Verfasst: Fr 13.05.05 08:55
wenn es keine implmentierung in der oberklasse gibt (der methode constructor), dann muss noch ein abstract dahinter. in der art:
Delphi-Quelltext 1:
| procedure constructor(...);virtual;abstract; |
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Fr 13.05.05 10:17
Moin!
iX0r hat folgendes geschrieben: | wenn es keine implmentierung in der oberklasse gibt (der methode constructor), dann muss noch ein abstract dahinter. in der art:
Delphi-Quelltext 1:
| procedure constructor(...);virtual;abstract; | |
1. Ist es AFAIR nicht möglich das Schlüsselwort Constructor als Methodennamen zu nutzen.
2. Meinte ich direkt den Constructor und keine Methode.
3. Woher weisst du / willst du wissen, dass er in der Klasse nix implementiert in der Klasse?
4. Nur weil man keinen Inhalt in der Methode hat, muss man noch lange nicht zu abstrakt greifen - ein leerer Methodenrumpf reicht auch. Abstrakt wird für andere Dinge / Zwecke benutzt. Oder habe ich das jetzt falsch verstanden? Weil mir kommt es so vor, als das du die Verwendung von Abstract als Folge der nicht-Implementierung benennst. Dabei ist es doch genau anders herum: Durch die Benutzung von Abstract darf keine Implementierung in der Klasse erfolgen - schon allein durch die Definition des Abstract Schlüsselwortes.
5. Die Lösung hilft noch nicht gegen das o.g. Problem.
MfG
Muetze1
_________________ 49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 14:00
Aha. Und was ich jetzt genau machen soll heißt auf Deutsch?
Okidoki. Wenn ihr alles sehen wollt, dann bitteschön.
hier die ganze Oberklasse
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| unit mTKugel; interface uses mSuM, mTTisch; type TKugel = CLASS
private procedure setzeRichtung (pRichtung : double); function hPosition ( ): double; function vPosition ( ): double; function gibRichtung ( ): double; public constructor init (pPosX, pPosY, pRadius, pRichtung : double); virtual; procedure zeichneDich ( ); virtual; procedure loescheDich ( ); virtual; procedure bewegeDich ( ); procedure merke (pTisch : TTisch); destructor gibFrei ( ); protected hatBuntstift : Buntstift; zPosX : double; zPosY : double; zRadius : double; zRichtung : double; kenntTisch : TTisch; end;
implementation constructor TKugel.init (pPosX, pPosY, pRadius, pRichtung : double); begin hatBuntstift := Buntstift.init; zPosX := pPosX; zPosY := pPosY; zRadius := pRadius; zRichtung := pRichtung; hatBuntstift.bewegeBis (zPosX, zPosY); hatBuntstift.dreheBis (pRichtung); end;
procedure TKugel.merke (pTisch : TTisch); begin kenntTisch := pTisch; end;
procedure TKugel.zeichneDich ( ); begin hatBuntstift.zeichneKreis (zRadius); end;
procedure TKugel.loescheDich ( ); begin hatBuntstift.radiere ( ); self.zeichneDich ( ); hatBuntstift.normal ( ); end;
procedure TKugel.bewegeDich ( ); begin self.loescheDich ( ); hatBuntstift.bewegeUm (0.05); if (self.hPosition+zRadius >= kenntTisch.anfangsXP+kenntTisch.tischBreite-4) or (self.hPosition-zRadius <= kenntTisch.anfangsXP+4) then begin self.setzeRichtung (180-self.gibRichtung); end; if (self.vPosition-zRadius <= kenntTisch.anfangsYP+4) or (self.vPosition+zRadius >= kenntTisch.anfangsYP+kenntTisch.tischHoehe-4) then begin self.setzeRichtung (360-self.gibRichtung); end; self.zeichneDich ( ); end;
procedure TKugel.setzeRichtung (pRichtung : double); begin zRichtung := pRichtung; hatBuntstift.dreheBis (pRichtung); end;
function TKugel.gibRichtung ( ): double; begin gibRichtung := zRichtung; end;
function TKugel.hPosition ( ): double; begin hPosition := hatBuntstift.hPosition ( ); end;
function TKugel.vPosition ( ): double; begin vPosition := hatBuntstift.vPosition ( ); end;
destructor TKugel.gibFrei ( ); begin hatBuntstift.gibFrei ( ); end; end. |
so und die hier die ganze Unterklasse.
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:
| unit mTSpurKugel; interface uses mSuM, mTTisch, mTKugel; type TSpurKugel = CLASS (TKugel) public hatBuntstift : Buntstift; constructor init (pPosX, pPosY, pRadius, pRichtung : double); override; procedure loescheDich ( ); override; end;
implementation constructor TSpurKugel.init (pPosX, pPosY, pRadius, pRichtung : double); begin inherited init (pPosX, pPosY, pRadius, pRichtung); hatBuntstift.runter; end;
procedure TSpurKugel.loescheDich; begin hatBuntstift.wechsle; self.zeichneDich; end; end. |
Zuletzt bearbeitet von Moony am Sa 14.05.05 08:45, insgesamt 4-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 13.05.05 14:06
Erstmal ein Hinweis, bevor ich mir das ansehe:
Bevor du Quelltext in das Eingabefeld hier schreibst kannst du oben auf Delphi drücken, und danach nochmal, dann wird der Quelltext hier formatiert dargestellt.
Code ist nicht so gut, weil damit nicht Delphi-Code hervorgehoben wird.
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 14:11
ahhh. Das sieht ja gleich schon ganz anders aus. Dankeschön
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 13.05.05 14:13
1. Also ein Fehler ist schonmal, dass du in Zeile 18 von deiner Unterklasse inherited mit den Parametern deiner Unterklasse aufrufst. Da musst du aber die der Oberklasse nehmen und die Geschwindigkeit mit angeben!
// edit:  , in deiner neuen Oberklasse ist das ja gar nicht mehr drin, also ist das Ok...
2. Woher die Fehlermeldung kommt, verstehe ich allerdings nicht, denn mit der Verwendung von virtual ist die Methode nicht mehr statisch...
Ich werde das mal zu Hause ausprobieren, was bei mir passiert!
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 14:16
Entschuldigung, das mit der Geschwindigkeit hatte ich nachträglich rausgenommen. Weil eigentlich sollte es rein, aber solange das Programm mit dem verhexten Fehler nicht funktioniert hab ich es rausgenommen. Das waren also Restbeständen die ich übersehen hatte. Sorry
Ach noch was die Fehler tauchen in Zeile 11 und 12 von der Unterklasse auf. Falls das hilft. Hoffe ich
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 16:52
Ist es vielleicht möglich, dass mein Delphi aufm Rechner keine Vererbung zulässt? Also das ich irgendwo was umstellen muss?? Vielleicht ne blöde Frage, aber ich wüsst sonst keine andere Erklärung mehr.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 13.05.05 17:05
Eventuell hilft auch mein Tutorial: tutorials.luckie-online.de
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 18:05
Jetzt weiß ich überhaupt nichts mehr. Ich hab mal aus reiner Verzweiflung virtual und override aus dem Programm gelöscht und jetzt funktioniert es..... Jedoch kommt wenn ich meine TSpurKugel durch den Tastendruck 's' aufrufen möchte ein Anwendungsfehler:
Zitat: | Exception EAccessViolation in Modul Billard.exe bei 00044D05.
Zugriffsverletzung bei Adresse 00444D05 in Modul 'Billard.exe'. Lesen von Adresse 00000000. |
Und beim zweiten Starten kommt folgender Fehler:
Zitat: | Im Projekt Billard.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00444D05 in Modul 'Billard.exe'. Lesen von Adresse 00000000'. Prozeß wurde Angehalten. Mit Einzelne Anweisung oder Start fortsetzen. |
dann wird ein grüner Pfeil auf die Zeile 19 von der Unterklasse angezeigt.
Hab ich ein mutiertes Programm oder will es mich einfach nur zur Weißglut bringen, wenn ja hat es das geschafft.
Moderiert von Tino: Quote-Tags hinzugefügt.
Zuletzt bearbeitet von Moony am Sa 14.05.05 17:35, insgesamt 1-mal bearbeitet
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 19:28
Ok, ich habs Problem weg. Es lag an einem Simekolonfehler im Hauptprogramm hinter einem gibFrei. Denn da stand keins.... Echt panne son Fehler!!!
Jetzt hab ich aber immmernoch das Problem damit, dass meine TSpurKugel zwar richtig programmiert ist ich sie aber nicht aufrufen kann wegen diesem komischen Zugriffsfehler.
Hoffe ihr habt darauf ne Erklärung??
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Fr 13.05.05 19:33
Ok ich nehm alles zurück!! Der blöde Fehler mit der statischen Methode ist bei erneutem starten von Delphi wieder da. ÜBERRASCHUNG.
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Sa 14.05.05 00:24
Moin!
1. hatBuntstift sollte in der Basisklasse im Protected Teil stehen
2. hatBuntstift hast du in der abgeleiteten Klasse neu definiert - also ist das eine neue Instanz. Dazu besteht das Problem, dass du keine neue Instanz anlegst für diese Variable und somit Probleme beim Zugriff bekommst.
Alles weitere schaue ich mir nachher an...
MfG
Muetze1
_________________ 49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Sa 14.05.05 08:35
Also gut. So wie ich dich vertanden habe. Muss ich in der Unterklasse im public-Teil den Buntstift rausnehmen und ihn nur in der Oberklasse unter protected stehen lassen.
Aha, gut gut. Das klappt auf einmal. Schön schön. Aber wenn ich nun die TSpurKugel mit dem Tastendruck 's' aufrufen will kommt immernoch dieser komische Zugriffsfehler. Und nu?
Moderiert von Tino: Quote-Tags hinzugefügt.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 14.05.05 17:26
Könnte der Fehler in Buntstift.wechsle sein?
|
|
Moony 
      
Beiträge: 97
Win XP
D7 Prof
|
Verfasst: Sa 14.05.05 17:28
Wie meinsten das?? Den Buntstift müsste die SPurkugel doch kennen und der Befehl ist auch der richtige....
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 14.05.05 17:31
Du benutzt die Klasse Buntstift in TKugel.
Falls aber in der Klasse schon ein Fehler ist (z.B. in der Methode Wechsle), kannst du in Kugel lange nach dem Fehler suchen.
|
|