Позвольте мне сначала попытаться объяснить, чего я пытаюсь достичь.
Я делаю игру, в которой игрок может получить бонусы (которые я почему-то назвал «добычей» в моей игре). Итак, вот действительно базовая форма моего лута класса:
public class Loot : Sprite
{
//Properties and fields...
public Loot(/*parameters...*/)
{
}
public virtual OnPickUp(Player player)
{
}
}
Player и Sprite - это мои классы. Вот моя проблема: мой класс спрайтов содержит позицию (Vector2, структуру из XNA, представляющую вектор), и из моего понимания того, как работает C #, копирование двух спрайтов будет копировать ссылку каждого другого, поэтому Я меняю свою позицию, она меняет и другую.
Всякий раз, когда должен появляться лут, у меня есть класс, содержащий возможные лоты, которые могут появиться, который возвращает случайный, и лут копируется и отображается на экране, но как только я получаю больше, чем один из того же типа из-за проблемы с эталонным копированием (оба будут иметь одинаковую позицию, и будет видна только одна).
Итак, я пытался создать новый объект Loot всякий раз, когда мне нужно было создать новый лут, поэтому мне пришлось предоставить конструктор с несколькими параметрами для простого копирования лута следующим образом:
(Давайте представим, что toSpawn может быть любым типом, производным от класса Loot, например HealthPack или любым другим)
Loot spawning = new Loot(toSpawn.Position, toSpawn.Color /*etc...*/);
Это выглядело правильно, пока я не решил реализовать "OnPickUp". Поскольку я создаю новый объект Loot , а не соответствующий дочерний класс, функциональность функции toSpawn *1023* OnPickUp исчезнет, и получение добычи закончится ничего не делать (это вызовет только пустую функцию базового класса Loot).
Очевидно, я здесь что-то не так делаю. У меня нет большого опыта программирования, и тем более с C #, поэтому я действительно не представляю, как я могу это исправить. Я попытался использовать объект Action , представляющий функциональность OnPickUp, он работал бы, но все же сильно ограничивал меня (так как я должен передать статическую функцию как Action , поэтому я не могу использовать информацию об игроке параметр и не позволяет мне использовать информацию подкласса).
Итак, наконец, мой вопрос на самом деле: Что было бы лучше, чтобы иметь подклассы с перегруженными функциями, но при этом иметь возможность клонировать базовый класс и его свойства?
Спасибо за ваше драгоценное время.
Если что-то недостаточно ясно (и я знаю, что это не так), просто спросите меня в комментариях, и я постараюсь описать мою проблему более подробно.