Próbuję zrobić coś a'la system przedmiotów z gier RPG. Mam coś takiego na obecny moment (uproszczony kod niżej). Mógłbym prosić o uwagi co poprawić albo dodać w obecnym kodzie aby 'łatwo' można było rozszerzać funkcjonalność? Powiedzmy teraz chciałbym dodać czary to dodam klasę abstrakcyjną Spell
, która implementuje interface IWeapon
i klasę specjalistyczną Fireball
która nadpisze metodę Hit
w zależności od potrzeb. Czy może lepszym rozwiązaniem jest całkowite pozbycie się interfejsu IWeapon
tylko abstrakcyjna metoda Hit
w klasie Weapon
albo jak w Potion
, że interface implementują klasy szczegółowe?
public interface IWeapon
{
void Hit(IAttackable target);
}
public abstract class Weapon : IWeapon
{
public string Name { get; protected set; }
public int AttackDamage { get; protected set; }
protected Weapon(string name, int attackDamage)
{
Name = name;
AttackDamage = attackDamage;
}
public abstract void Hit(IAttackable target);
}
public sealed class Sword : Weapon
{
public Sword(string name, int attackDamage)
: base(name, attackDamage)
{
}
public override void Hit(IAttackable target)
{
target.TakeDamage(AttackDamage);
}
}
public sealed class Axe : Weapon
{
public int ArmorPenetration { get; }
public Axe(string name, int attackDamage, int armorPenetration)
: base(name, attackDamage)
{
ArmorPenetration = armorPenetration;
}
public override void Hit(IAttackable target)
{
var pen = (int)(target.Defense * ArmorPenetration);
target.TakeDamage(AttackDamage - (target.Defense - pen));
}
}
public interface IUsable
{
void Use(Unit unit);
}
public abstract class Potion
{
public string Name { get; protected set; }
public int Points { get; protected set; }
protected Potion(string name, int points)
{
Name = name;
Points = points;
}
}
public sealed class HealthPotion : Potion, IUsable
{
public HealthPotion(string name, int points)
: base(name, points)
{
}
public void Use(Unit unit)
{
unit.HealthPoints = unit.HealthPoints + Points > unit.MaxHealth
? unit.MaxHealth
: unit.HealthPoints + Points;
}
}