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

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

61

20.11.2006, 23:26

Ok neues Beispiel:

Wir haben ein einfaches 3D Spiel. Wir haben verschiedene Klassen die verschiedenes tun. Ein 3D Objekt besteht aus: Modell, x, y, z Koordinate, dies Speichern wir in der untersten Klasse <Objekt>. Animationen sind bestimmte Objekte die aus z.B. Bones aufgebaut sind, und werden bei uns separat gespeichert und verwaltet.

Wir haben eine weitere Klasse <"Dynamisches Objekt">, und <Statisches Objekt>. Beide erben von <Objekt>. Dynamisches Objekt bekommt Methoden zum bewegen der 3D Objekte. Statische Objekte hingegen bewegen sich in unserer Welt nicht (das sind z.B. Bäume, Häuser etc.).

Wir erstellen einer weitere Klasse <Vehicles> wo wir alle Fahrzeuge hineinschmeissen wollen, sowie eine Klasse <Humans>. <Humans> kommen unsere Menschen hinein, die wir natürlich Animieren müssen, also kommt da eine Methode "animation()" hinein, die unsere Klasse <Animation> nutzt. <Vehicles> mussen nicht animiert werden.

Eine ganz einfache Situtation für Mehrfachvererbung. Man hat Klassen die einzelne Objekte verwalten und die nötige Funktionalität bereitstellen um sie zu manipulieren. Mit Hilfe von Mehrfachvererbung kann man also eine sehr "natürliche" Welt generieren und muss in die Klasse 3D Objekt nicht sowas wie "Typ" machen nur um zu unterscheiden ob das nun (statisch, dynamisch) - (animiert oder nicht) sein soll. Es ist einfach weniger Fehleranfällig ^^.

p.s. in Cpp gibt es auch interfaces - einfach eine rein virtuelle Klassen eben.

Quellcode

1
2
3
4
5
6
7
<Object> ---- <Dyn. Obj.> ------------------ <Human>
      |                            |               |
      |                            |---- <Vehicle> |
      |                                            |
      | ----- <Stat. Obj.>                         |
                                                   |
<Animation> ---------------------------------------


Bei Spielen gibt es im normalfall wirklich viele Klassen, meist werden diese durch Analyse des Programms modeliert (UML). Jeder Klasse werden bestimmte Eigenschaften gegeben, die diese Klasse und ihr Nachfahren haben. Man sieht sehr leicht das schnell 5 oder mehr vererbungsstufen so entstehen können!

62

21.11.2006, 16:11

In C# und Java würde man das über ein Interface machen (IAnimated), was ich auch logischer finde (zumindest für dieses Beispiel), da es meist keine Standardimplementierung gibt, bei sowas.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

63

21.11.2006, 17:06

Kurze Zwischenfrage: wo ist der große Unterschied zwischen Klassen+Interface in Java und Klassen in C++?
Also wenn ich das richtige sehe, haben die in Java nur die Funktionalität aufgespalten und daraus "ein halb neue Erfindung mit einem ganz neuen Namen" gemacht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

64

21.11.2006, 17:38

Zitat von »"Nox"«

Kurze Zwischenfrage: wo ist der große Unterschied zwischen Klassen+Interface in Java und Klassen in C++?
Also wenn ich das richtige sehe, haben die in Java nur die Funktionalität aufgespalten und daraus "ein halb neue Erfindung mit einem ganz neuen Namen" gemacht.

Genau. Interfaces definieren nur Methoden, implementieren diese jedoch nicht. Also das was man bei C++ 'vollstaendig abstrakt' nennen wuerde.
"Have you tried turning it off and on again?"

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

65

21.11.2006, 18:06

Na toll folgendes Bleistift(Beispiel ;) ):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class DatenElement
{   
[...]
    virtual DWORD   UpdateToNet(char**)                 { return 0; }
    virtual void    UpdateFromNet(DWORD, char*)         {}

    virtual void    LoadChildrenFromNet(DWORD, char*)   {}
    virtual DWORD   SaveChildrenToNet(char**)           { return 0; }
    virtual void    LoadFromNet(DWORD, char*) = 0;
    virtual DWORD   SaveToNet(char**) = 0;
[...]
};


Wie würde man das in Java realisieren? Weil es ist ja eine Kombination aus abstrakten und virtuellen(also bei Bedarf überladbare) Methoden.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

66

21.11.2006, 19:04

nein Nox nicht ganz.

Interfaces müssen pure virtual sein - da es bei Cpp nicht das Schlüsselwort interface gibt (jedenfalls lt. Standard). In Java schreibt man einfach statt class interface.

Bsp:

C-/C++-Quelltext

1
2
3
4
5
6
class IMyInterface
{
   public:
      virtual IMyInterface& operator= (const IMyInterface&) = 0;
      virtual void Print(void) = 0;
};


du kannst aber auch interface deifnieren, besonders bei größeren Softwareprojekten bzw. Frameworks macht das Sinn:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#define interface class

interface IMyInterface
{
   public:
      virtual IMyInterface& operator= (const IMyInterface&) = 0;
      virtual void Print(void) = 0;
};


Damit sagst du den Benutzern deiner Klasse das diese ein Interface ist.
Jede Klasse die IMyInterface erbt, muss jetzt einen Zuweisungsoperator und eine Methode Print bereitstellen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

67

21.11.2006, 19:11

koschka, ich habe gefragt, wie man sowas in Java realisieren würde, wie es in C++ geht weiß ich(das war ein ausschnitt aus meiner netzwerkklasse)...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

68

21.11.2006, 19:16

@Nox: Schlüsselwort abstract

Quellcode

1
2
3
4
public abstract class Gebaeude
{
  public abstract void foo();
}

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

69

21.11.2006, 19:16

ahso ^^ hab mich versehen ;)
Einfach mit dem Schlüsselwort interface und implements.

Im übriegen müssen aber bei einem Interface alle Methoden rein virtuell sein, was sie aber doch oben nicht sind! Normalerweise müsste dies doch (nur) eine abstrakte Klasse sein.

Quellcode

1
2
3
4
5
6
7
8
9
interface GeomObjektTrans {
   void verschieben();
   void strecken();
} 

class GeoObjekt implements GeomObjektTrans {
    void verschieben();
            { .... konkrete Verschiebeoperationen ...... }
}


@malignate88
abstract sagt das du eine Abstrakte Klasse haben willst. Eine Abstrakte klassehat aber nicht die gleichen Eigenschaften wie ein Interface. So kann eine Klasse mehrere Interfaces implementieren, aber (in Java) nur von einer erben (mit extends). Weiterhin enthällt ein Interface nur Methoden und evtl. noch Konstanden, aber nie Attribute - im Gegenteil zur abstrakten Klasse.
Abstrakte Klassen können auch ein "default" Verhalten implementieren, interfaces nicht.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

70

21.11.2006, 19:26

So damit hätten wir doch schon eine Schwachstelle von Java in Hinsicht auf Vererbung. Es ist in Java keine Kombination möglich :)

Und nochmal ich weiß wie es in C++ geht :P es geht darum wie man sowas in JAVA macht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige