Ich versuche, ein leistungsstarkes Spiel-Inventar-System zu implementieren. Ich habe diese abstrakte Basisklasse unterschiedliche Art der Gegenstände in der Bestands zu speichern, zum Beispiel Münzen, Taschenlampe, Messer etc ..Spiel-Inventar-System erstellen, ohne Casting zu abgeleiteten
public abstract class ObtainableItem
{
public string Name { get; private set; }
public ObtainableItem(string name)
{
Name = name;
}
}
Zum Beispiel habe ich eine Doorkey habe, die eine Tür öffnet. DoorKey hat eine Eigenschaft KeyCode, die zum Öffnen einer Tür verwendet wird.
public class DoorKey : ObtainableItem
{
public int KeyCode { get; private set; }
public DoorKey() : base("key")
{
KeyCode = 1234;
}
}
Alle ObtainableItem werden in Inventar gespeichert
public class Inventory
{
const int slotCount = 2;
ObtainableItem[] slots = new ObtainableItem[slotCount];
public Inventory()
{
slots[0] = new DoorKey();
}
}
Jetzt Benutzer vorstellen, zieht Doorkey aus seinem Inventar an einer Tür und löst Open-Methode
public class Door
{
public void Open(ObtainableItem key)
{
if (key is DoorKey)
{
DoorKey doorKey = (DoorKey)key;
if (doorKey.KeyCode == 1234)
{
// Open door
}
}
else
{
// "can't use this item on a door"
}
}
}
Wie Guss von ObtainableItem zu einem vermeiden Türschlüssel? Ich habe gelesen, dass die Verwendung von Casting eine schlechte Übung ist und auf ein schlechtes Code-Oop-Design hinweist. Idealerweise sollte eine Door-Klasse so aussehen. Gibt es ein Muster für mein Inventarsystem?
public class Door
{
public void Open(DoorKey key)
{
if (key.KeyCode == 1234)
{
// Open door
}
}
}
Wo hast du gelesen * Casting ist schlechte Übung *, ich habe noch nie so etwas gelesen. –
@ErikPhilips bezieht sich wahrscheinlich auf den Overhead von Boxen/Unboxing –
@RandRandom ja, also dann ist es * Boxen/Unboxing kann Performance-Probleme verursachen *, die deutlich anders als * schlechte Praxis * ist. –