Die parent Class als "Container" für alle child Klassen nehmen?



  • Das sind aber Grundlagen der Objektorientierung - packe die Member in die Basisklasse, anders geht es nicht (ansonsten müsstest du ja in den abgeleiteten Klassen jeweils diese Member haben - und das wäre dann 'Codebloat').

    Nachtrag: Die Member solltest du dann als Eigenschaften (properties) zur Verfügung stellen (anstatt direkt dann mit den Klassenvariablen zu arbeiten).
    Für die meisten Eigenschaften reichen ersteinmal die "automatic properties", z.B.

    bool Moveable { get; private set; }
    

    "private" für den Setter, damit man von außerhalb nur lesen kann.



  • Jau danke für den Deutschuss!

    Ich bin noch relativ skeptisch mit dem Umgang mit Properties. Inwiefern können diese mir überhaupt hier von nutzen sein, sie bieten eine Sicherheit an - aber brauche ich das denn bei nem kleinen Game Project? Oder sollte man sich einfach dran gewöhnen die zu nutzen



  • Falke88 schrieb:

    Oder sollte man sich einfach dran gewöhnen die zu nutzen

    Du solltest Properties bevorzugen, wo es nur geht - und es geht fast immer 😉
    Neben der zusätzlichen Abstraktion (die dir vllt. erst später gelegen kommt) bieten sie auch andere Vorteile. Sie sind für DataBinding geeignet und sie arbeiten besser mit Reflection zusammen.

    Spontan fällt mir nur ein Nachteil von Properties ein: Man kann sie nicht direkt als out/ref Parameter an andere Funktionen übergeben. Da muss man mit einer Hilfsvariable arbeiten.



  • Kann man ne Property nicht als Parameter übergeben? wenn "get" doch ohne zugriffsmodifizierer also implizit public (denke mal das dies so bei VS / C# der Fall ist) deklariert ist, dürfte man doch über den Property Bezeichner als Argument das Ganze übergeben können?

    Oder meinst du was anderes



  • Falke88_tmp schrieb:

    Kann man ne Property nicht als Parameter übergeben? wenn "get" doch ohne zugriffsmodifizierer also implizit public (denke mal das dies so bei VS / C# der Fall ist) deklariert ist, dürfte man doch über den Property Bezeichner als Argument das Ganze übergeben können?

    Oder meinst du was anderes

    Du kannst eine Property natürlich als Parameter übergeben. Nur nicht als out/ref-Parameter.



  • Lies genauer 😉
    Es geht um die out / ref Parameter, also z.B. ist folgendes nicht möglich:

    DoSomething(ref Moveable);
    

    sondern nur

    bool moveable = Moveable;
    DoSomething(ref moveable);
    Moveable = moveable;
    

    Aber ref und out sollte man sowieso nur sehr sparsam einsetzen - z.B. bei den TryParse-Methoden, da der Rückgabewert mit dem Erfolg des Parsens schon belegt ist.

    Edit: too late, too late



  • Ha ok mit out/ref bin ich noch nicht in Berührung gekommen, ich festige immer gerne neu erlerntes mit eigenen Projekten. Umso faszinierender sind neue Tricks die cih dann in neuen Projekten anwenden kann. Ist n ziemlich gutes Prinzip für festen Lernerfolg 😉



  • public void EndTurn<T>(IEnumerable<T> units) // warum nicht static?
        where T : Unit // oder gleich ein Interface IUnit machen
    { 
        foreach(var u in units) 
            u.moveable = true; 
    }
    

    Hm?
    Wobei das rumfummeln in den Innereien einer Klasse sowieso nicht schön ist.
    Also warum nicht gleich

    public static void EndTurn<T>(IEnumerable<T> units)
        where T : IUnit
    { 
        foreach(var u in units) 
            u.EndTurn();
    }
    

    ?



  • hustbaer schrieb:

    public void EndTurn<T>(IEnumerable<T> units) // warum nicht static?
        where T : Unit // oder gleich ein Interface IUnit machen
    { 
        foreach(var u in units) 
            u.moveable = true; 
    }
    

    Hm?
    Wobei das rumfummeln in den Innereien einer Klasse sowieso nicht schön ist.
    Also warum nicht gleich

    public static void EndTurn<T>(IEnumerable<T> units)
        where T : IUnit
    { 
        foreach(var u in units) 
            u.EndTurn();
    }
    

    ?

    Wie bezeichnet man diese Vorgehensweise - möchte mich da erstmal einlesen bevor ich das blindlinks verwenden. Sieht auf jedenfalls nach dem aus was ich suche! 🕶



  • Falke88 schrieb:

    Wie bezeichnet man diese Vorgehensweise

    Äh. Programmieren?

    Ne, weiss nicht, was genau meinste? Die Generics (die <T> Sache)? Oder die Verwendung eines Interfaces? ...?



  • Ha ne meinte schon das mit den Generics. kenne das keyword where noch nicht.

    Sieht so aus als könnte man in der Methoden Deklaration für jede "where" Bedingung die zutrifft einen anderen Anweisungsblock reinpowern. Ähnlich wie ne Switch Anweisung?



  • Nein. Das where ist ein Type-Constraint, welches auf den Typ T abzielt.
    Siehe dazu http://msdn.microsoft.com/en-us/library/bb384067.aspx



  • Sorry das ich gerade zu faul bin den Link zu folgen 😛

    Aber ein Constraint ist eine Einschränkung richtig? D.h für <T> können nur die Möglichkeiten die bei "where" definiert sind angegeben werden?



  • Nein.
    Aber das googelst du dir bitte selbst.


Anmelden zum Antworten