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:
AOgegenstand = object(AObenutzbar)
...
end;
AObenutzbar = object
procedure BenutzeMit(item : AOgegenstand);
....
end;
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
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
das musst du mit prototypen regeln
Code:
type
UrDing =class;
Objekt =class;
Item =class;
UrDing =class
private
bezeichnung:string;
public
end;
Objekt =class(UrDing)
private
public
procedure machwasmit(Ding : Item);
end;
Item =class(UrDing)
private
public
procedure machwasmit(Ding : Objekt);
end;
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.
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.
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.
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.
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.
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.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.