Ich versuche, eine Basisklasse mit den folgenden Eigenschaften zu erweitern:
Code: Select all
public class MovingItem : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
Da sich MovingItem und die oben genannten Elemente in diesem Fall im Vererbungsbaum auf derselben Ebene befinden, kann ich keine Variable wie diese zuweisen:
Code: Select all
MovingItem mi = new Weapon() { ... };
Eine offensichtliche Lösung wäre, diese Itemss so zu gestalten, dass sie MovingItem anstelle von Item erben, aber ich könnte mir zwei Probleme mit dieser Art von Lösung vorstellen:< /p>
- Was wäre wenn Diese Klassen können nicht geändert werden, da es sich um Drittanbieterklassen handelt (z. B. Steuerelemente in einigen UI-Bibliotheken).
- Was wäre, wenn in Zukunft Ich möchte die Items-Logik auf eine grundsätzlich andere Art und Weise erweitern als MovingItem, wie PickupableItem
Code: Select all
public class MovingItem : T where T : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
Aber leider ist das nicht möglich, der Compiler sagt, dass die Klasse nicht vom Typparameter erben kann:
Code: Select all
CS0689: Cannot derive from 'T' because it is a type parameter
Code: Select all
public class ItemCollection { ...
public void Add(Item item) { ... }
}
...
MovingItem movingWeapon = new Weapon(); { ... }
itemsCollection.Add(movingWeapon); // .Add(...) accepts argument of type Item
Wie gehe ich das an?