В моей игре у меня есть базовый класс Loot, который имеет методы, универсальные для всего, что может быть захвачено игроком и сохранено в его инвентаре. Это будет включать зелья, оборудование, боеприпасы и т. Д. Я могу экипировать стрелы, но не зелья. Таким образом, Arrow будет подклассом Ammo, который в конечном итоге будет получен от Loot. Я могу пить зелье, но не стрелу. Таким образом, Potion будет подклассифицировать Loot, но реализовать IConsumeable. И так далее.Метод BaseClass, который возвращает произвольный подкласс BaseClass
Объекты лута имеют свойство Количество (10 стрел, 2 зелья). В моем классе Loot у меня есть метод Split, который позволяет игроку взять «стек» предметов (например, стрелки) и разделить его на два отдельных стека. Поэтому он уменьшает количество экземпляров экземпляра на определенную сумму, а затем возвращает новый экземпляр Arrow с значением Quantity = =, который был взят из исходного экземпляра.
Моя идея заключалась в том, что я напишу метод в Loot, так как любой Loot может быть уложен в стек, если его свойство int StackLimit больше 1. После уменьшения вызывающего лута на указанное количество я верну новый объект того же типа. Проблема в том, что я не знаю, какой тип подкласса Loot будет объектом.
public abstract class Loot
{
public int Quantity { get; set; }
public Loot Split(int quantityToTake)
{
Loot clone = (Loot)this.MemberwiseClone();
//RestrictNumberToRange(int min, int max, int value) is a delegate which clamps a value to min,max
this.Quantity -= Utility.RestrictNumberToRange<int>(1, this._quantity - 1, quantityToTake);
clone.Quantity = quantityToTake;
return clone;
}
}
Действительно ли это плохой способ? Я думал о Отражении, но я слышу смешанные мнения о том, использовать или не использовать его в таком случае.
Невозможно определить способ борьбы с этим. Самый большойSubClass?
Я знаю, что у моих подклассов могут быть разные конструкторы, поэтому, вероятно, нецелесообразно пытаться возвратить «new this.FurthestSubclass()», потому что я не знаю, как его построить. Но я бы хотел иметь дело с его методами Loot, поэтому я использую Loot для возвращаемого типа.
Знаете, я только что кое-что объяснил мне недавно по этим строкам, и я подумал, что получил. Ясно, что я еще не достиг Дзен. Спасибо, спасибо. Итак, чтобы быть ясным: если этот экземпляр - это Стрела, которая происходит от Ammo, которая происходит от Loot, метод Split вернет Arrow? – 2010-07-24 21:23:15
@ Супер, да, это правильно. Дженерики абсолютно замечательные! –
Как я уже сказал, я видел это раньше (на самом деле делегат в моем примере использует его), но, увидев, что он применяется здесь, действительно открыл глаза - спасибо, человек. – 2010-07-24 21:30:25