В игре на основе плиток я использую разные классы для описания поведения разных типов плиток.Они (очевидно) происходят от базового класса.Теперь у меня проблема в том, что иногда мне нужно выяснить, достаточно ли у игрока средств, чтобы заплатить за апгрейд до определенного типа плиток.
Поскольку стоимость типа плиток остается неизменной,Казалось бы, имеет смысл сделать это статичным.К сожалению, C #, похоже, не позволяет использовать абстрактные классы или интерфейсы для обеспечения существования такого статического поля в дочернем классе.
Моим «решением» было получить эти данные с помощью отражения, но, похоже,для меня довольно некрасиво и потенциально опасно, так как я мог бы забыть статическое поле в одном из дочерних классов, что могло бы разрушить все это…
Следующий фрагмент кода - это то, что у меня сейчас есть;AllowedUpdates
- это List<System.Type>
, содержащий типы, на которые можно обновить плитку.
foreach (Type t in AllowedUpdates) {
// Get the Action Point Cost
FieldInfo fi = t.GetField ("actionPointCost", BindingFlags.NonPublic | BindingFlags.Static);
int cost = (int)fi.GetValue (null);
// Check for any requirements
bool requirementsFulfilled;
try {
// Get the static method that checks the necessary requirements.
MethodInfo mi = t.GetMethod ("CheckRequirements", new Type[] { typeof(Dictionary<string, ProtoObject>) });
object[] arguments = { neighbourFields };
// Invoke this method
object returnValue = mi.Invoke (null, arguments);
requirementsFulfilled = (bool)returnValue;
} catch (ArgumentNullException) {
// This type has no special requirements, pass it.
requirementsFulfilled = true;
} catch (NullReferenceException) {
// No requirements needed, pass it.
requirementsFulfilled = true;
}
}
Должен быть лучший способ сделать это.Есть ли шаблон дизайна, который я пропустил?