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

1

02.09.2012, 16:30

Von anfangs unbekannter Klasse erben?

Hallo,

habe mal wieder eine Frage, und zwar wollte ich wissen was ihr von dem Lösungsansatz zu dieser Problematik haltet:

-> Problematik:
Ich habe drei Klassen, einmal die Männlich Klasse, Weiblich Klasse und die Mensch Klasse.
Die Mensch Klasse soll so allgemein wie möglich bleiben, in der Klasse gibt es keine "Fähigkeiten" die nur Weibliche oder
nur Männliche Menschen besitzen.

So, jetzt möchte ich ein Objekt vom Typ "Mensch" erstellen und sagen das es die Fähigkeiten eines Männlichen Mensch besitzt...
Also auf Klartext, ich möchte das dass "Mensch" Objekt die Funktionen der Klasse "Männlich" übernimmt und das erst zur
Erstellung des Objektes!

Mein Ansatz war dieser:

C-/C++-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
class Maennlich
{
   public:

   void einparken();
   void imStehenPinkeln();
};

class Weiblich
{
   public:

   void schminken();
   void seheIchDarinFettAusFragen();
};

template <class T>
class Mensch : public T
{
    public:

    void sprechen() { }
    void essen() { }
    void trinken() { }
};

// ...

Mensch<Maennlich> mann;

mann.einparken();

Das ganze funktioniert auch Prima, aber da ich über Google nichts derartiges gefunden habe sind meine Fragen dazu:

Ist das ganze vertretbar oder einfach nur schlechtes Design?
Muss ich dafür gesteinigt werden?
Wenn das ganze nicht vertretbar ist, wie würdet ihr es realisieren?

Vielen Dank schon einmal im Voraus für jede Antwort! :)

Kaktus

Frischling

Beiträge: 19

Beruf: Schüler

  • Private Nachricht senden

2

02.09.2012, 16:41

Ich habe auch nicht so viel Ahnung, was gutes Design ist, aber ich würde das einfach wie folgt realisieren:
Maennlich und Weiblich von Mensch erben lassen, und dann machst du z.B.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Mensch { ... };
class Maennlich : public Mensch { ... };
class Weiblich : public Mensch { ... };

Mensch * einMann = new Maennlich(); 
// bzw.
Maennlich mann;
mann.einparken();

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

3

02.09.2012, 16:48

Ich schliesse mich Kaktus voll und ganz an.
Vererbung wird häufig mit dem sprachlichen "ist ein" gleichgesetzt.

Ein Mensch ist eine Frau.
Ein Mensch ist ein Mann.


Das macht wenig Sinn. Da schon eher:

Eine Frau ist ein Mensch.
Ein Mann ist ein Mensch.


Oder stell dir vor, du hast ein Frau-Objekt erstellt und möchtest die Methoden von diesem aufrufen:

C-/C++-Quelltext

1
2
Frau* FrauObj = [...];
FrauObj->Sprechen(); //<- Das geht schief.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

02.09.2012, 16:57

Ist das ganze vertretbar oder einfach nur schlechtes Design?
Nein, Du hast allerdings das Konzept von Vererbung noch nicht verstanden. Genau wie das Konzept von IF.

Muss ich dafür gesteinigt werden?
Müssen nicht ;)
Die Templates allerdings sind da total überflüssig und fehl am Platz und scheinbar für Dich der technische Weg Dein Verständnisproblem zu lösen. Geht, ist aber natürlich falsch.

Wenn das ganze nicht vertretbar ist, wie würdet ihr es realisieren?
Genau so, wie es Vererbung vorsieht. Du hast da quasi eines der Paradebeispiele. Ob nun Menschen, Autos oder Tiere, ist am Ende alles das selbe. Nur muss man es am richtigen Ende anfangen und nicht verkehrt herum.
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]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

03.09.2012, 13:32

Muss ich dafür gesteinigt werden?
Müssen nicht ;)

wie er schon geschrieben hat: müssen nicht
aber warum sollten wir auf etwas spaßiges verzichten wollen? ;D

es wurde bereits häufiger geschrieben, dass es sinnvoller ist, die Klassen "Mann" und "Frau" von "Mensch" abzuleiten


ich denke mal, dass du gerade erst dabei bist, dich mit der Objektorientierung zu beschäftigen
wenn das so ist, könnte folgendes vorerst eher verwirrend für dich sein:
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" ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

03.09.2012, 13:44

Falls er mehrere Geschlechter auf verschiedene Spezies aufteilen will, dann klingt das nach genau dem, was es sein sollte: Ein Attribut. Vererbung würde hier dann aber dennoch nicht über eine entsprechende Oberklasse "Männlich" und "Weiblich" stattfinden, sondern z.B. trotzdem noch von "Mensch" zu "Mann" und "Frau" als Unterklasse, die aber je einen anderen Wert des Attributs für Geschlecht liefern, sowie entsprechende Methoden passend überschreiben. Ein Interface für "geschlechtlich" bietet sich somit deutlich besser an als eine Template-Ober-Klasse.
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]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

7

03.09.2012, 14:43

ich wollte eher darauf hinaus, dass in einem solchen Fall die Vererbung nochmal überdacht werden sollte
ansonsten würde man für _jedes_ Lebewesen (Mensch, Hund, Katze) eine "Männlich" und eine "Weiblich" Klasse implementieren

wenn ich es richtig verstanden habe, soll die "Mensch" Klasse das Interface implementieren
da aber erst durch die Unterklassen klar wird, wie die Implementierung aussieht, müsste Mensch eine abstrakte Methode (oder abstrakte Property, sofern möglich) besitzen
allerdings sehe ich nicht den Sinn, für das Geschlecht ein Interface zu definieren
mal angenommen, dass es später auch noch die Klassen "Hund" und "Katze" gibt, die ebenfalls dieses Interface implementieren
welchen Fall könnte es geben, in dem man Objekte speichern muss, die ein Geschlecht besitzen müssen? (und sonst nichts weiter, da das Interface nur dies definieren dürfte)
weiterhin sollte es in einem solchen Fall nicht ausreichen, für die Klassen die Basisklasse "Lebewesen", "Tier" o. ä. zu verwenden, da dann das Interface wieder nicht notwendig wäre

oder um es nochmal ausdrücklicher zu formulieren:
was würde gegen ein Attribut/eine (abstrakte) Methode in der entsprechenden Oberklasse sprechen?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

03.09.2012, 15:30

Nichts. Ein Lebewesen hat im Normalfall ein Geschlecht, ein Mensch auch. Aber er wollte es ja gekapselt. Ich würde es definitiv in der Oberklasse als Attribut einführen. Interface dann, falls es irgendwo relevant sein sollte, was in diesem Beispiel vermutlich nicht der Fall ist. Ist aber eben manchmal notwendig oder sinnvoll, wenn man Mehrfachvererbung verhindern will oder muss.
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]

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

9

03.09.2012, 16:01

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Mensch { ... };
class Maennlich : public Mensch { ... };
class Weiblich : public Mensch { ... };

Mensch * einMann = new Maennlich(); 
// bzw.
Maennlich mann;
mann.einparken();


Dieses Beispiel muss ich leider ergänzen, nicht das frau denkt wir wären hier sexistisch oder so ...

C-/C++-Quelltext

1
2
3
Mensch* eineFrau = new Weiblich();
eineFrau->kochen();
//usw...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

03.09.2012, 16:27

LOL, besser is das aber auch nicht, oder Fireball? ^^ Der Mann kann einparken, die Frau kann kochen? Böse Klischees.
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]

Werbeanzeige