Поднимите свойство в класс-родитель.
Сделайте виртуальные методы в родителе bool Damage( int damagPoints ), bool Heal (int healthPoints).
Зафиксируйте инварианты в родителе: отрицательного здоровья не может быть, отрицательный урон наносить нельзя, отрицательные лечение делать нельзя, выше максимального передела шакала здоровья быть не может.
Если хотите сделать некоторых конкретных Enemy с особыми свойствами, то сделайте реализации инвариантов также виртуальными. Допустим Slug получает 50% урона и только чётный урон.
Тогда например Slug:
new public bool Damage( int damagePoints )
{
if (isDamageAcceptable(damagePoints))
{
int appliedDamage = Math.Ceiling(damagePoints/2);
TakeDamage(appliedDamage);
}
return isDamageAcceptable(damagePoints);
}
new protected bool isDamageAcceptable( int damagePoints) => (damagePoints > 0) && (0==damagePoints%2) );
Обобщение есть согласие наследника наследовать И интерфейс И функциональность. Инвариант может расширяться, если он сужается, то это значит, что наследование не подходит для данного класса.
В вашем примере вопрос не имеет смысла, так как нет наследования иерархии функциональности. У вас просто какие-то поля с автогенерацией бесполезных методов для чтения и записи полей.
Если речь о том, что у не у всех задуманных Enemy может быть здоровье, то вам нужно либо менять модель отношения классов и пересмотреть абстракции, либо использовать композицию вместо наследования.