C# C# (XNA) Liste mit unterschiedlichen Objekten verschiedener Klassen (und Sortierung)

MrMeeseeks

Newbie
Registriert
Dez. 2015
Beiträge
1
Hallo liebe Community!

Ich arbeite mit C# und XNA 4.0, und ich würde gerne eine Liste anlegen, welche mit unterschiedlichen Objekten unterschiedlicher Klassen gefüllt werden kann und sich aufgrund der Variablen der Objekte sortieren lässt.

Ich erzeuge zunächst Objekte unterschiedlicher Klassen

Code:
        protected void creator_Goods(int createGoods_Max)
        {
            for (int i = 1; i < createGoods_Max; i++)
            {
                cGoods Goods = new cGoods(); ;
                List_AllGoods.Add(Goods);
            }
        }

und

Code:
        protected void creator_Humans(int createHumans_Max)
        {
            for (int i = 1; i < createHumans_Max; i++)
            {
                cHumans Human = new cHumans(); ;
                List_AllHumans.Add(Human);
            }
        }

Nun hätte ich alle Objekte gerne in einer Liste, um diese sortieren zu können (bisher sortiere ich via linq) ("myValue" ist ein public Vector2 in beiden Klassen), ich dachte an sowas:

Code:
var List_allObjects_sorted = List_allObjects.OrderBy(member => member.myValue.Y);

Aber mit

Code:
List<object> List_allObjects = new List<object>();

lässt sich später nicht auf den myValue-Wert zugreifen oder Methoden ausführen.

Am Ende sollte es noch möglich sein, Methoden der Klassen aufrufen zu können, wie zb. (diese Methode gibt es wieder in beiden Klassen)

Code:
foreach (object member in  List_allObjects_sorted)
            {
                member.Draw();   
            }

Könnte mir hierbei jemand helfen? Das wäre super!

LG
MrMeeseeks
 
Zuletzt bearbeitet: (typo)
Wenn ich mich gerade nicht ganz vertue dann solltest du das mit virual Keyword und einer virtuellen Basisklasse lösen können, von der die Klassen cHumans und cGoods erben und als welche sie in deine Liste eingefügt werden. Ansonsten müsstest du mit Variadic Templates einen multivariaten Container basteln oder einen aus einer vorhandenen Bibliothek verwenden.
 
Methodennamen sollen groß geschrieben werden.
Für mich hört sich das so an als bräuchtest du Vererbung

E.g. ein "WorldObject" mit der Property SortOrder von der sowohl Human als auch als auch Good befinden. Im Constructor der jeweiligen klasse kannst du dann das Sortorder setzen. (0 für Human 1 für Goods).

Dann kannst du eine List<WorldObject> myObjects machen. bzw. myObjects.OrderBy(x => x.SortOrder).

sdwaroc schrieb:
die Klassen cHumans und cGoods .
Bitte nochmal lesen:
Do not use a type prefix, such as C for class, on a class name. For example, use the class name FileStream rather than CFileStream.
 
Zuletzt bearbeitet von einem Moderator:
Methodennamen sollen groß geschrieben werden.
Das ist keine Regel. Hier kann man sich an Coding-Guidelines halten. Hauptsache es ist einheitlich.

An der Uni bei uns gilt basal: Camel Case für zusammengesetzte Namen, Klassen groß, Funktionen klein, nach Möglichkeit keine "_", ist aber dann von Institut zu Institut im Detail wieder unterschiedlich. Do as u like but allways do it as before.

Bitte nochmal lesen:
Ich hab mir die Namen nicht ausgesucht sondern von oben übernommen. Erst lesen, dann meckern. Hier wir nicht nach Naming-Conventions, sondern nach einer Problemlösung gefragt. Will hier aber beim besten Willen keinen Krieg vom Zaunpfahl brechen, Anmerkung ist mMn absolut legitim.

Immerhin bei der Vererbung sind wir uns ja einig :)
 
sdwaroc schrieb:
Das ist keine Regel. Hier kann man sich an Coding-Guidelines halten. Hauptsache es ist einheitlich.
Sorry, ich hab gar nicht gesehen dass er das so gemacht hat sonst hätte ich das so an ihn gerichtet gepostet.
Natürlich ist es kein zwang die Guidelines um zu setzen.
Wenn man allerdings was neues lernt sollte es ordentlich tun.
(Und wenn es nur ist dass der TE nun weiß dass es Naming-Guidelines gibt.)
 
Lass einfach sämtliche Objekte ein gemeinsames Interface implementieren. z.B. ISortable (oder so). Dann kannst du easy durchiterieren.

Code:
public interface ISortable
{
    // Get/Set
    myValue MyValue
    {
        get;
        set;
    }

     void Draw();

}

Dann deine Klassen entsprechend anpassen, z.B:
Code:
public class cHumans : ISortable 
{
    //...
}

public class cGoods : ISortable 
{
    //...
}

Deine Listendeklaration müsste auch angepasst werden:

Code:
List<ISortable> List_allObjects =  new List<ISortable>();

So jetzt kannst du durch deine Liste iterieren:

Code:
foreach (ISortable member in  List_allObjects_sorted)
{
     member.Draw();   
}

Gl & Hf

Btw, du weißt aber schon, dass XNA obsolet ist, oder?
Btw2, deine "Nomenklatur" ist tatsächlich etwas suboptimal, guck dir entweder offizielle Coding Guidelines an oder einfach den Code von erfahreneren Entwicklern.
 
Zuletzt bearbeitet:
Mal ein Beispiel wies aussehen könnte wenn man sich an die Naming Conventions hält:
Code:
public interface IDrawable
{
    Vector2 Position { get; set; }
    void Draw();
}

public class Human : IDrawable
{
    public Vector2 Position { get; set; }
    
    public void Draw()
    {
        //TODO: Objekt zeichnen
    }
}

public class Good : IDrawable
{
    //TODO: siehe Human
}

Angewendet wird das ganze dann so:
Code:
var drawables = new List<IDrawable>() 
{ 
    new Human(), new Good(), new Human()
};

foreach(IDrawable d in drawables.OrderBy(x => x.Position.Y))
{
    d.Draw();
}


Und noch ein paar nützliche Links für den TE:
Vererbung
Polymorphie
.NET General Naming Conventions
 
Zuletzt bearbeitet:
Zurück
Oben