Я пытаюсь расширить базовый класс следующими свойствами:
Код: Выделить всё
public class MovingItem : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
в этом случае, поскольку MovingItem и вышеупомянутые Items находятся на «одном уровне» в дереве наследования, я не могу назначить переменную следующим образом:
Код: Выделить всё
MovingItem mi = new Weapon() { ... };
Очевидным решением было бы наследовать MovingItem вместо Item, но я мог бы подумать о двух проблемах с таким решением:< /p>
- Что, если невозможно изменить эти классы, поскольку они являются сторонними (например, элементы управления в какой-либо библиотеке пользовательского интерфейса).
- Что, если в будущем Я хотел бы расширить логику Items другим способом, чем MovingItem, например PickupableItem
Код: Выделить всё
public class MovingItem : T where T : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
Но, к сожалению, это невозможно, компилятор говорит, что класс не может наследовать параметр типа:
Код: Выделить всё
CS0689: Cannot derive from 'T' because it is a type parameter
Код: Выделить всё
public class ItemCollection { ...
public void Add(Item item) { ... }
}
...
MovingItem movingWeapon = new Weapon(); { ... }
itemsCollection.Add(movingWeapon); // .Add(...) accepts argument of type Item
Как мне это сделать?
Подробнее здесь: https://stackoverflow.com/questions/793 ... sses-to-it
Мобильная версия