Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Klassenaufbau

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.11.2006, 11:47 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ich mache mir gerade ein paar Gedanken über ein kleines Programm das ich entwickeln will um mal wieder ein bisschen in die Objektorientierung reinzukommen.
Leider bin ich mir nicht sicher wie ich die Verschiedenen Klassen am Besten in Verbindung zueinander setze.

Also ich habe eine Klasse Character, eine Klasse Rasse, eine Klasse Unterrasse, eine Klasse Beruf, eine Klasse Fähigkeiten und eine Klasse Talente.

Ein Character ist jetzt eine imaginäre Figur welche eine bestimmten Rasse angehört. Bestimmte Rassen haben Unterrassen welchen der Character angehören kann. Außerdem hat der Character einen bestimmten Beruf und in abhängigkeit zu all dem bestimmte Talente und Fähigkeiten.

Den Beruf, die Talente und die Fähigkeiten mal außen vorgelassen scheitert es bei mir schon daran wie ich die Characterklasse am optimalsten mit der Rasse und der Unterrasse in Verbindung setzte.
Momentan habe ich es so das die Klasse Unterrasse eine Membervariable hat welche auf eine Rasse Instanz zeigt und die Characterklasse hat eine Membervariable welche auf eine Unterrasse Instanz zeigt.

So kann ich über eine Character Instanz auf alle Informationen der Rasse und der Unterrasse zugreifen. Nur leider hat nicht jede Rasse auch eine Unterrasse bzw. muss der Character keiner Unterrasse angehören.

So alles in allem bin ich ein wenig verwirrt und hoffe jemand kann hier mit guten Tipps helfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.11.2006, 13:23 Uhr
ao

(Operator)


Könnte man sowas hier ansetzen:

C++:
class Rasse { };

class Unterrasse : public Rasse
{
    Rasse & oberrasse;
};


Eine Unterrasse ist eine Rasse mit besonderen Eigenschaften, nämlich, dass sie eine Oberrasse hat?

Dann könntest du die Figur so definieren:

C++:
class Figur
{
    const Rasse * rasse;
};


und im Member rasse entweder eine Rasse- oder eine Unterrasse-Instanz festhalten. Über dynamic_cast könntest du zur Laufzeit bestimmen, ob der rasse-Pointer einer gegebenen Figur-Instanz auf Rasse oder auf Unterrasse zeigt, und entsprechend reagieren.

Der Umstand, dass manche Rassen keine Unterrassen haben, wird dann im Programm dadurch abgebildet, dass die Unterrasse einer Figur sowas wie NULL ist.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.11.2006, 13:29 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


hmm ja das ist eine Gute Idee, ich denk mal drüber nach
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.11.2006, 14:05 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also ich hab das jetzt so mal gemacht und das funktioniert zwar auch, aber ich bin mir nicht sicher ob das so schick designed ist.
Die Klassen sind so wie von dir oben beschrieben aufgebaut nur das Rasse noch ein Attribut Name hat.
Die Figur bekommt beim Konstruktor dann entweder ein Rasse oder ein Unterrasse Object übergeben.
Ein Beispielprogramm dazu in C# würde jetzt so aussehen um den Namen der Rasse und der Unterrasse auszugeben:

C++:
RACE r = new RACE();
r.Name = "ELF";
SUBRACE s = new SUBRACE();
s.Name = "DROW";
s.MainRace = r;

Character c = new Character(s);

if (c.Subrace != null)
   Console.WriteLine(c.Subrace.MainRace.Name);
Console.WriteLine(c.Race.Name);



Es wird auch richtig erst "Elf" und dann "Drow" ausgegeben, aber würde man intuitiv nicht eher denken das man über c.Race an die Rasse und damit an den Namen "Elf" kommt und an "Drow" nur über c.Subrace.Name?

Dieser Post wurde am 09.11.2006 um 14:06 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.11.2006, 14:26 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ok hab dafür auch eine Lösung indem ich den Getter von Race in der Character Klasse so angepasst habe:

C++:
public RACE Race
        {
            get
            {
                if (race.GetType() == typeof(SUBRACE))
                {
                    SUBRACE r = (SUBRACE)race;
                    return r.MainRace;
                }
                return race;
            }
        }



Komisch finde ich nur das das nicht ging:

C++:
return (SUBRACE)race.MainRace;


Aber erstmal nicht so wichtig


So mal schauen wann das nächste Problem kommt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.11.2006, 14:30 Uhr
ao

(Operator)


Ach, es soll C# sein, dann ist es ja noch einfacher.

Ungetestet hingekritzelt:

C++:
class Race
{
    string name;
    
    public Race (string name)
    {
        this.name = name;
    }
    public string Name { get { return this.name; } }
}

class Subrace : Race
{
    Race superRace;
    
    public Subrace (string name, Race superRace)
        : base (name)
    {
        this.superRace = superRace;
    }
        
    public Race SuperRace { get { return superRace; } }
}

class Character
{
    Race race;
    
    public Race
    {
        get
        {
            if (this.race is Subrace)
                return this.race.SuperRace;
            else
                return this.race;
        }
    }

    public Subrace Subrace
    {    
        get
        {
            if (this.race is Subrace)
            {
                return this.race as Subrace;
            }
            else
            {
                return null;
            }
        }
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.11.2006, 14:49 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das hier

C++:
return this.race.SuperRace;


funktioniert ja wie in meinem letzten Post beschrieben leider nur über einen Umweg, ansosten überdeckt sich das mit meiner Version. Danke

Dieser Post wurde am 09.11.2006 um 14:49 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: