Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 07:01

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Vererbung
BeitragVerfasst: So Dez 07, 2008 22:42 
Offline
DGL Member

Registriert: Mi Dez 03, 2008 20:07
Beiträge: 7
Hallo,

also ich hab ein kleines Problem bei meinem aktuellen Projekt. Das ganze soll ein Adventure werden mit Objekten, die in der Gegend rumstehen und benutzt oder mit Items aus dem Inventar kombiniert werden können. Die Items können auch untereinander kombiniert werden und natürlich auch einfach nur benutzt werden.

Da kommt einem die tolle Idee ein Vaterobjekt zu basteln, von dem die beiden dann erben. Da gibts dann unter anderem eine Prozedur BenutzeMit, die ein Item (AOGegenstand) als Eingabe erhält, denn ich kann nur Items mit anderen Items oder Objekten benutzen, Objekt mit Objekt geht ja nicht. Nochmal in Code:

Code:
  1.  
  2. AOgegenstand = object(AObenutzbar)
  3. ...
  4. end;
  5. AObenutzbar = object
  6.    procedure BenutzeMit(item : AOgegenstand);
  7.    ....
  8. end;
  9.  


Problem ist jetzt bei mir, wenn ich
a) Die beiden Objekte in der Reihenfolge wie oben definiere, also zuerst AOGegenstand, dann AObenutzbar, wird gemeckert bei der Definition von AOgegenstand, weil er kein AObenutzbar kennt.
b) Zuerst AObenutzbar definiere und dann AOgegenstand, wird gemeckert, weil ich in der Zeile "AObenutzbar = object(AObenutzbar)" AObenutzbar neu definiere, weil das scheinbar schon die Zeile "procedure BenutzeMit(...)" irgendwie macht.

Also, wie kann ich das nun machen, dass die sich untereinander verstehen? Oder kann ich einfach als Eingabe keine Daten eines Erben reingeben?
Nun, ich hoffe ihr habt da tolle Ideen, danke schonmal, Radulf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 08, 2008 00:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
das musst du mit prototypen regeln



Code:
  1.  
  2. type
  3.   UrDing = class;
  4.   Objekt = class;
  5.   Item = class;
  6.  
  7.   UrDing = class
  8.   private
  9.     bezeichnung:string;
  10.   public
  11.   end;
  12.  
  13.   Objekt = class(UrDing)
  14.   private
  15.   public
  16.      procedure machwasmit(Ding : Item);
  17.   end;
  18.  
  19.   Item = class(UrDing)
  20.   private
  21.   public
  22.      procedure machwasmit(Ding : Objekt);
  23.   end;
  24.  
  25.  


so ungefähr. Ist natürlich nicht 100%. Also du legst die Klassen nicht direkt an, sondern schreibst ähnlich wie bei methoden erstma nen Prototypen, um das gewünschte schonmal überall bekannt zu machen. Auf diese weiße kann wenig schiefgehen, weil Objekt weiß das Item existiert und Item weiß das Objekt existiert.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 08, 2008 09:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Sellmann hat recht. Wenn du die Klassen vorher definierst dann weiß der Kompiler, dass es da etwas gibt und kann das berücksichtigen.

ABER. Nicht immer ist die erste Lösung die Lösung des eigentlichen Problemes. In deinem Falle lässt sich dadurch das Problem des Kompilers lösen. Nur frage ich mich warum muss dein AObenutzbar zwingend einen Nachfahre kennen? Das deutet für mich darauf hin, dass die beiden Klassen sehr sehr stark miteinander verbunden sind (untrennbar). Entweder könntest du dann die beiden Klassen zu einer zusammenfassen oder aber du musst dafür sorgen, dass BenutzeMit auch mit einem AObenutzbar klar kommt. Oder aber die BasisKlasse müsste dann AOgegenstand sein. Nicht unbedingt jeder Gegenstand ist benutzbar. Aber das ist eine Frage des Designs.

Ich bin noch etwas müde und weiß daher nicht so recht ob ich das zum Ausdruck bringen konnte was ich wollte. Nur solltest du mal überlegen ob die von dir gewählte Struktur dem entspricht wie es sein soll. Das hängt aber von deinem Ziel etc etc etc ab. Das ist etwas was nur du entscheiden kannst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 08, 2008 16:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ließ dir mal durch was Interfaces sind. Ich denke die können dir hier weiterhelfen.

Das machst du ein Interface für "Benutzbare", für "Inventarisierbare", und wenn du willst das nur Objekte einer bestimmte Gruppe mit sich selbst etwas bestimmtes tun können, dann kannst du für die auch noch ein Interface definieren.

Deine eigentlichen Objectklassen implementieren dann die Interfaces die sie brauchen. Wenn ein Objekt z.B. Benutzbar und Inventarisierbar sein soll, implementiert es einfach beide Interfaces.

Das Thema Interfaces wurde auch kurz im 3. Softwareentwicklungstutorial erklärt: http://wiki.delphigl.com/index.php/Tuto ... Interfaces

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 08, 2008 17:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
In Pascal bedeuten Interfaces schon einen gehörigen Mehraufwand was das Schreiben von Code angeht. Und wenn dann muss man eigentlich auch komplett auf interfaces setzen, denn es ist potentiell ziemlich gefährlich Klasseninstanzen und Interfaces gleichzeitig zu benutzen, da man bei interfacebasierten Objekten nicht mitbekommt, wann es freigegeben wird. Also bei so etwas passiert es häufig, dass einem die Klasseninstanzen unter dem Hintern weggelöscht wird.

Meiner Meinung nach sollte man sich gut überlegen ob man Interfaces benutzt oder nicht (auch wenn die tierisch praktisch sind). Und wenn dann wäre es besser, wenn man schon ein paar Jahre mit normalem OOP gearbeitet hat.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 09, 2008 13:44 
Offline
DGL Member

Registriert: Mi Dez 03, 2008 20:07
Beiträge: 7
Danke für die Hilfe. Ich versuch mich mal an der Methode von Sellmann. Jetzt mag er das aber auch wieder nicht ganz. "[ erwartet aber ; erhalten" quasi direkt hinter dem AOBenutzbar = object; Oder klappt das irgendwie nur mit class oder so?

Ihr anderen glaub ich wollt das wohl viel feiner einteilen, als ich das geplant hab ^^ Es soll einfach 2 Erben geben, einmal die Items im Inventar und einmal die Gegenstände die in der Gegend rumstehen und AOBenutzbar ist halt der Vater von den beiden. Und um was miteinander zu benutzen beginnt das ganze mit einem Item, das man wiederum mit einem anderen Item oder einem herumstehenden Gegenstand verknüpft, deswegen halt als Eingabe ein Item.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 09, 2008 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was mir jetzt erst auffällt. Du benutzt objects. Das ist etwas wozu ich absolut nicht raten kann! Also wenn, dann solltest du wie in Sellmanns Beispiel auch wirklich Klassen (class) benutzen. Objects sind veraltet und haben den ein oder anderen Fehler. Das war nur der erste Versuch von Borland so etwas ähnliches wie Klassen einzubauen.

[edit] Ich habe die Disskussion über Interfaces abgeschnitten und in ein neues Thema gepackt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]