2 回答

TA貢獻1963條經(jīng)驗 獲得超6個贊
我會將接口替換為具有默認實現(xiàn)的抽象基類,然后將Attack方法分解為單獨的可重寫步驟。我Attack為完全擁有自己的攻擊模式的敵人制作了虛擬。
abstract class BaseEnemy {
public virtual void Attack() {
AttackIdentify();
AttackSignal();
AttackAttack();
}
protected virtual void AttackIdentify() {
Console.WriteLine("This is an enemy");
}
protected virtual void AttackSignal() {
Console.WriteLine("Enemy is jumping");
}
protected virtual void AttackAttack() {
Console.WriteLine("Enemy is attacking");
}
}
class Enemy1 : BaseEnemy {
protected override void AttackIdentify() {
Console.WriteLine("This is an enemy 1");
}
}
class Enemy2 : BaseEnemy {
}
class Enemy3 : BaseEnemy {
protected override void AttackIdentify() {
Console.WriteLine("This is an enemy 3");
}
}
//Let's say this enemy is not capable of jumping, so we want to remove the code that says enemy is jumping.
class Enemy4 : BaseEnemy {
protected override void AttackSignal() { }
}
//Let's say this is the boss and instead of jumping, it will roar.
//So we want to change the code that says enemy is jumping to enemy is roaring.
class Enemy5 : BaseEnemy {
protected override void AttackSignal() {
Console.WriteLine("Enemy is roaring");
}
}
如果您仍然需要該接口IEnemy,則可以BaseEnemy實現(xiàn)它。

TA貢獻1874條經(jīng)驗 獲得超12個贊
這是它的抽象類版本的基本示例。
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相同的方式工作,但設置不同的屬性,當您調(diào)用該Attack方法時,這些屬性將相應顯示。我希望您注意的有趣部分是Enemy3覆蓋該方法的類。Virtual這可以通過在抽象類中創(chuàng)建方法來實現(xiàn)Enemy。
此覆蓋允許仍然調(diào)用Attack類中的基類方法Enemy,而且它還顯示自定義值。所以它非常靈活。
請注意,這對于提供的示例非常有效,但是通過使用您的類名,我可以輕松地假設真正的項目是什么,這不是正確的方法。您不應該為每個敵人創(chuàng)建一個不同的類,但這超出了問題的范圍。
- 2 回答
- 0 關注
- 154 瀏覽
添加回答
舉報