Вот базовый пример его абстрактной версии класса.
public abstract class Enemy
{
public bool CanJump { get; set; } = false;
public bool CanRoar { get; set; } = false;
public bool CanAttack { get; set; } = false;
public virtual void Attack()
{
Console.WriteLine("This is an enemy");
if (CanJump)
{
Console.WriteLine("Enemy is jumping");
}
if (CanRoar)
{
Console.WriteLine("Enemy is roaring");
}
if (CanAttack)
{
Console.WriteLine("Enemy is attacking");
}
}
}
public class Enemy1 : Enemy
{
public Enemy1()
{
CanJump = true;
CanRoar = true;
}
}
public class Enemy2 : Enemy
{
public Enemy2()
{
CanRoar = true;
CanAttack = true;
}
}
public class Enemy3 : Enemy
{
public Enemy3()
{
CanRoar = true;
CanAttack = true;
}
public override void Attack()
{
base.Attack();
Console.WriteLine("Custom thing");
}
}
Вы заметите, что Enemy1
и Enemy2
работают одинаково, но задают разные свойства, которые при вызове Attack
метод будет отображаться соответственно.Интересная часть, на которую я хочу обратить ваше внимание, это класс Enemy3
, который переопределяет метод.Это выполнимо, сделав метод Virtual
в абстрактном классе Enemy
.
Это переопределение позволяет по-прежнему вызывать метод базового класса Attack
в классе Enemy
PLUS, также он отображает пользовательское значение,Так что это очень гибкий.
Обратите внимание, что это прекрасно работает для предоставленного примера, но, подойдя к названию вашего класса, я легко могу предположить, каков реальный проект, и это не правильный способ сделать это.Вы не должны создавать разные классы для каждого врага, но это выходит за рамки вопроса.