Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

03.09.2012, 17:38

Ohh... da hab ich wohl ein sehr schlechtes (und auch falsches) Beispiel für meine Problematik gewählt.
Was Vererbung ist, wozu man es braucht, ... ist mir alles schon (mehr oder weniger) bewusst.

Sacaldur hat da meine Problematik schon eher getroffen:

Zitat

allerdings deutet die Benennung "Männlich" und "Weiblich" ein wneig darauf hin, dass du eventuell nicht nur Menschen, sondern auch Hunde oder Katzen haben willst, die auch Männlich oder Weiblich sein können
in einem solchen Fall wäre es nur schwer möglich, die über Vererbung zu regeln
da allerdings Methoden vorhanden sind, die darauf hinweisen, dass es nur Menschen sein sollen:
verwende lieber die Namen "Mann" und "Frau" ;)

Um meiner Problematik noch näher zu kommen, dieses (hoffentlich bessere) Beispiel:

Ich habe zwei Basis Klassen, diese heißen: "Knochen" und "Skelett"
Nun habe ich noch eine Basis Klasse welche "Lebewesen" heißt.

------->
In meiner Welt (:P) gibt es Lebewesen welche nur aus einem Knochen
bestehen und welche die aus einem Knochen - Skelett bestehen.
<------

... So, wenn ich jetzt mehrere Lebewesen erstellen möchte, welche mit nur einem Knochen
und welche mit einem Skelett, dann... ach, ich glaube man versteht worauf das hinaus geht...

...

Deswegen war mein erster Ansatz auch das ganze einfach über Objekte, Setter und Getter
zu lösen doch dieser Ansatz hat mir nicht gefallen, weil ich möchte das mein Lebewesen ohne
Umwege (ohne Getter) auf ihre "Fähigkeiten" zugreifen können.

Abgesehen davon würde es später problematisch werden, wenn man versehentlich die
Funktion "getBone()" eines Lebewesen aufruft um auf das "Knochen" Objekt zuzugreifen und
dieses Lebewesen ja eigentlich aus einem Skelett besteht.

Viele würden dann auch fälschlicherweise denken das die "getBone()" Methode einen
einzelnen Knochen des gesamt Skeletts zurück gibt. Was ein verständlicher denk Fehler ist
da das Skelett auch aus Knochen besteht.

...

Aus diesem Grund habe ich dann auf Vererbung gesetzt....
Doch auch da kam ich an meine Grenzen:

-> Mehrfachvererbung: class Lebewesen : public Knochen, public Skelett

# Schlecht, weil dann das jeweilige Lebewesen aus einem Knochen und zusätzlich einem Skelett
welches wieder aus mehreren Knochen zusammengesetzt wird, besteht. Also hat das resultierende
Objekt Funktionalitäten welche die Knochen Klasse besitzt und das obwohl ich diese nicht
benötige, wenn ich ein Lebewesen aus einem Skelett erstelle.

-> Mehrere Klassen: class Lebewesen_Knochen : public Knochen

# Kommt nicht in Frage, viel zu viel Aufwand. Da muss ich nicht mal weiter
drüber nachdenken.

-> Und so kam ich zur Idee mit den Templates...

... Und das war der Punkt wo ich halt hing, bis ich gestern noch drauf gekommen
bin das Lebewesen eigentlich auch noch eine Basis Klasse ist von der später geerbt wird.

...

Ich möchte einen Menschen erstellen ->

class Mensch : public Lebewesen, public Skelett

Das setzt dann allerdings voraus das Lebewesen eben nichts von Skelett und Knochen erbt.
Somit habe ich aber dann prinzipiell ja doch Klassen erstellt welche von den jeweiligen Basis Klassen
erben... *Kopfschmerzen* :dash:

......

*Kopfschmerzen³* :dash: ...
Versteht man jetzt zumindest was meine Problematik war und irgendwie noch eigentlich ist?

@BlueCobold

Zitat

Genau wie das Konzept von IF.

Was meinst du damit?

... Auf Gefahr mich zu blamieren ... *Absenden*

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jack« (03.09.2012, 17:44)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

12

03.09.2012, 17:55

folgende Dinge kann man sagen:
ein Lebewesen besitzt ein Skelett
ein Skelett setzt sich aus (beliebig vielen) Knochen zusammen

daraus könnte man ableiten:
ein Lebewesen besitzt eine Instanz der Klasse Skelett
und jede Instanz von Skelett besitzt beliebig viele Instanzen (eine Liste) von Knochen
der Fall, dass ein Lebewesen nur einen Knochen hat, ist damit ebenfalls abgedeckt ;)

theoretischerweise könnte man für einknöchige Lebewesen eine "getKnochen" Methode erstellen, die dann den einzigen im Skelett vorhandenen Knochen liefert
allerdings sollte man sich Gedanken machen, ob man das _wirklich_ benötigt
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

13

03.09.2012, 18:37

Das hatte ich auch schon durchdacht, aber was mir an diesem Ansatz nicht gefallen hat war die Tatsache das nun mal
ein einzelner Knochen ganz andere Funktionalitäten hat als ein Skelett. Das Skelett hat z.B auch mehrere Funktionen welche > 1 Knochen benötigen.

Wenn ich ein Lebewesen erstellen möchte welches dauerhaft nur aus einem Knochen besteht, aber von einer Skelett
Klasse erbt, dann hätte ich Funktionen die mir angeboten werden, welche ich nie verwenden werde / verwenden kann.

Z.B Knochen zu verbinden. Einen einzigen Knochen zu verbinden geht wohl schwer.
Bei einem Knochen sind viele Funktionalitäten des Skelettes nutzlos und irgendwie kann ich
mich nicht damit anfreunden das ein Objekt Funktionen besitzt, die es gar nicht verwenden kann.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

03.09.2012, 20:18

Scaldur hat Recht. Ein Lebewesen mit nur einem Knochen ist ein Spezialfall eines Skelettes. Es bleibt aber ein Skelett. Das ist wie ein Polygon mit nur einer Ecke, ein Polygonmodell mit nur einem Polygon, ein Wald mit nur einem Baum, eine Stadt mit nur einem Haus. Ich würde da jetzt nicht anfangen mir ein merkwürdiges Konstrukt aus den Fingern zu saugen.
Ist das diesmal Dein wirklicher Fall oder ist das auch wieder nur eine Beispielskonstruktion? Denn wie Du siehst ist jedes Beispiel eigen und bietet daher verschiedene Herangehensweisen. Wenn das Skelett mehr als ein Knochen haben muss, dann würde ich mir überlegen, warum das so ist und warum Du nicht einen Spezialfall eines Skeletts ableitest, der eben einen Knochen hat oder eben mehrere. Ein Skelett mit einem Knochen ist eben ein Sonderfall, eine Spezialisierung. Genau das stellt man bei Vererbung dar. Entweder kann ein Skelett damit klarkommen oder es braucht eine Unterklasse, damit das geht. Ich würde eher dazu tendieren, dass die Anzahl der Knochen erstmal pupsegal ist für ein Skelett. Warum auch nicht? Welche Funktionen oder Methoden brauchen denn unbedingt mehr als einen Knochen und wieso sollen diese nicht mehr valide sein, falls es nur einen Knochen hat? Ich kann mir im Moment keine solche Funktion vorstellen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

15

03.09.2012, 20:36

Ja, das oben genannte Beispiel ist schon ziemlich nah an meiner Konstruktion, also es geht jedenfalls aufs gleiche hinaus.

... Mhh, sorry aber ein Polygon mit einer Ecke?... Wie soll ich mir das vorstellen? :D
Ein Wald mit einem Baum ist für mich kein Wald und eine Stadt mit einem Haus auch keine Stadt...
Deswegen ist für mich ein einzelner Knochen auch kein Skelett.

Wenn ich bei einem Skelett z.B ... Knochen knacke... Ok, bei dem Beispiel
gibt es nicht wirklich viele Funktionen wo mehr als ein Knochen benötigt wird.

Aber trotzdem bleiben unzählige Funktionen übrig, die nutzlos sind, weil das
Objekt immer nur ein Knochen besitzen wird.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

03.09.2012, 20:49

Wie du ja selbst schon sagst:

In meiner Welt (:P) gibt es Lebewesen welche nur aus einem Knochen
bestehen und welche die aus einem Knochen - Skelett bestehen.

Deine Lebewesen haben Skelette die aus Knochen bestehen. Vererbung drückt etwas völlig Anderes aus. Was du willst, ist nicht Vererbung sondern Komposition:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Bone
{
  ...
};

class Skeleton
{
  Bone bones[206];
  ...
};

class Human
{
  Skeleton skeleton;
  ...
};


Durch so etwas wie

C-/C++-Quelltext

1
class Human : public Bone, public Skeleton { ... };

drückst du aus, dass ein Mensch gleichzeitig ein Knochen und ein Skelett ist, was natürlich völliger Schwachsinn ist:

C-/C++-Quelltext

1
class MenschErbtVonKnochenOderSkelett : public Schwachsinn { ... };  // ;)


Menschen haben Knochen und ein Skelett, wobei das Skelett eben aus Knochen besteht (also Knochen hat). Es ist ein fundamentaler Unterschied, ob man etwas ist (-> Vererbung) oder etwas hat (-> Komposition)... ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (03.09.2012, 22:34)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

03.09.2012, 22:08

Mhh, sorry aber ein Polygon mit einer Ecke?... Wie soll ich mir das vorstellen? :D

Stichwort Kugelgeometrie. Da gibt es sogar Dreiecke mit 3 rechten Winkeln. Spannende Sache, aber geht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

18

04.09.2012, 16:05

Mhh... Ok, wenn Vererbung nach dem "ist ein" Prinzip läuft... heißt das dann dass ich immer
sobald "ist ein" nicht passt einfach ein Objekt in der Klasse erstelle, nach dem Motto "besteht aus"?

Also:

C-/C++-Quelltext

1
class Affe : public Tier

Affe ist ein Tier.

C-/C++-Quelltext

1
2
3
4
5
class Affe
{
   public:
   Skelett skelett;
};

Affe besteht aus Skelett.
Oder wäre hier Vererbung auch akzeptable?

... "Komposition" ...
Ich schätze mal ich sollte ein Buch über Objektorientierung im allgemeinen Lesen um
diese Begrifflichkeiten zu verstehen / kennen, richtig? Ich habe jedenfalls so langsam das Gefühl
dass es mir noch an Wissen in diesem Bereich fehlt.

Was haltet ihr von dem Buch: Klick?

@BlueCobold
Kugelgeometrie, ok, aber ist nicht die Eigenschaft eines Polygons das es Ecken > 1 hat? ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

04.09.2012, 16:07

Mhh... Ok, wenn Vererbung nach dem "ist ein" Prinzip läuft... heißt das dann dass ich immer
sobald "ist ein" nicht passt einfach ein Objekt in der Klasse erstelle, nach dem Motto "besteht aus"?

Naja, eigentlich heißt das erstmal nur, dass, sobald "ist ein" nicht passt, Vererbung nicht passt... ;)

Also:

C-/C++-Quelltext

1
class Affe : public Tier

Affe ist ein Tier.

C-/C++-Quelltext

1
2
3
4
5
class Affe
{
   public:
   Skelett skelett;
};

Affe besteht aus Skelett.
Oder wäre hier Vererbung auch akzeptable?

Was genau würde deiner Meinung nach hier für Vererbung sprechen?

20

04.09.2012, 16:09

Gegenfrage: Was würde dagegen sprechen? :P

Rein theoretisch geht es doch aufs gleiche hinaus, ob ich nun einfach das Skelett Vererbe oder
ob ich ein Objekt erstelle und anschließend über ein Getter an die Methoden ran komme?

So sehe ich das zumindest, aber ich möchte mich schon an das "ist ein" Prinzip halten,
weil es auch eigentlich logisch klingt. Trotzdem sehe ich da (noch) keinen gravierenden Unterschied. :P

Werbeanzeige