首页 文章

C#:定义基类中的方法实现和派生类中的属性

提问于
浏览
3

我正在制作一个游戏,其中我有多种士兵,每种都有自己的属性(速度,攻击力......) . 显然,所有这些都可以走路,攻击......所以我认为用这些方法创建一个抽象类Soldier,以及每个单元属性的子类都是合适的 . 问题是我不能在基础类中使用派生类的属性 .

简单的方法可能是在派生类中实现方法,但这意味着许多重复的代码,我想避免它 . 实际上,这会使基类不必要 .

我尝试过几件事 . 据我所知,我尝试的最接近的解决方案是使用抽象/虚拟属性,但我再次复制每个单元类型的“获取”代码 . 也许这是无法避免的,但我想,如果可能的话 .

肯定存在一个我没有想过的简单解决方案 . 有任何想法吗?

我想这样的想法:

public abstract class Soldier {

    public int AttackPower {
        get { return this.power; }
    }

    public Attack {
        Console.WriteLine("Attacked with "+AttackPower+" attack power");
    }
}

public class Lancer:Soldier {

    int power=5;
}

public class Archer:Soldier {

    int power=10;
}

当然,这不是一个正确的解决方案,因为Soldier类不知道“power”变量,但如果我在Soldier类中声明“power”变量,我会收到错误,因为字段名称是重复的 .

任何帮助将不胜感激 .

2 回答

  • 2

    为什么不在基类中放置 Power 属性?

    public abstract class Soldier {
        public int Power {get; set;}
    
        public int AttackPower {
            get { return this.Power; }
        }
    
        public Attack {
            Console.WriteLine("Attacked with "+AttackPower+" attack power");
        }
    }
    
    public class Lancer:Soldier {
        public Lancer()
        {
            Power = 5
        }
    }
    
    public class Archer:Soldier {
        public Archer()
        {
             Power=10;
        }
    }
    

    一些设计评论:

    • 您是否需要 ArcherLancer 的不同类,或者它们只是 Soldier s配置不同?

    • 最好从数据源中提取这样的属性值,而不是在源代码中对它们进行硬编码 . 您可以嵌入XML文件或其他内容,因此不容易编辑 .

  • 4

    你需要一个抽象的属性:

    public int AttackPower {
            get { return this.power; }
        }
    
    protected abstract int Power { get; }
    
    public class Lancer:Soldier {
    
        protected override int Power { get { return 5; } }
    }
    

    如果您真的发现了"GetPower"方法,如果基类方法需要访问数据,则必须在基类中声明该数据 .

    它不是代码重复,它的类型安全!

相关问题