Как расширить логику базового класса, имея возможность назначать ему производные классыC#

Место общения программистов C#
Ответить
Anonymous
 Как расширить логику базового класса, имея возможность назначать ему производные классы

Сообщение Anonymous »

У меня возникли проблемы с пониманием следующей концепции:
Я пытаюсь расширить базовый класс следующими свойствами:

Код: Выделить всё

public class MovingItem : Item
{
public Vector2 Acceleration { get; set; }
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
}
и у меня есть несколько классов Item, описывающих разные элементы, например. Сфера, Оружие, Спрайт и т. д. и т. п., они по своей сути имеют разную логику, но все они являются предметами
в этом случае, поскольку MovingItem и вышеупомянутые Items находятся на «одном уровне» в дереве наследования, я не могу назначить переменную следующим образом:

Код: Выделить всё

MovingItem mi = new Weapon() { ... };
Поскольку, очевидно, Weapon — это Item, так же как и MovingItem, но Weapon не является MovingItem
Очевидным решением было бы наследовать MovingItem вместо Item, но я мог бы подумать о двух проблемах с таким решением:< /p>
  • Что, если невозможно изменить эти классы, поскольку они являются сторонними (например, элементы управления в какой-либо библиотеке пользовательского интерфейса).
  • Что, если в будущем Я хотел бы расширить логику Items другим способом, чем MovingItem, например PickupableItem
I подумал, что что-то подобное может сработать:

Код: Выделить всё

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
В конечном итоге я хотел бы найти решение, в котором я мог бы создать объект MovingItem из другого объекта Item, а затем работать, как этот MovingItem это элемент вот так...

Код: Выделить всё

public class ItemCollection { ...
public void Add(Item item) { ... }
}
...
MovingItem movingWeapon = new Weapon(); { ... }
itemsCollection.Add(movingWeapon); // .Add(...) accepts argument of type Item
Итак... есть ли решение такой проблемы: расширить Item, оставаясь при этом Item, для всех других классов, которые его наследуют?
Как мне это сделать?


Подробнее здесь: https://stackoverflow.com/questions/793 ... sses-to-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»