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

C#:定义基类中的方法实现和派生类中的属性,c#,inheritance,abstract,C#,Inheritance,Abstract,我正在做一个游戏,我有很多种士兵,每种都有自己的属性(速度,攻击力…)。显然,他们都能走路,攻击。。。所以我认为用这些方法创建一个抽象类,并用每个单位属性创建子类是合适的。问题是我不能在基类中使用派生类的属性 简单的方法可能是在派生类中实现方法,但这意味着会有大量重复的代码,我希望避免这种情况。事实上,这会使基类变得不必要 我试过几种方法。据我所知,我尝试的最接近的解决方案是使用抽象/虚拟属性,但我还是会为每种单元类型复制“get”代码。也许这是不可避免的,但如果可能的话,我愿意 肯定存在一个我

我正在做一个游戏,我有很多种士兵,每种都有自己的属性(速度,攻击力…)。显然,他们都能走路,攻击。。。所以我认为用这些方法创建一个抽象类,并用每个单位属性创建子类是合适的。问题是我不能在基类中使用派生类的属性

简单的方法可能是在派生类中实现方法,但这意味着会有大量重复的代码,我希望避免这种情况。事实上,这会使基类变得不必要

我试过几种方法。据我所知,我尝试的最接近的解决方案是使用抽象/虚拟属性,但我还是会为每种单元类型复制“get”代码。也许这是不可避免的,但如果可能的话,我愿意

肯定存在一个我没有想到的简单解决方案。有什么想法吗

我想到一些像这样的想法:

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”变量,我会得到一个错误,因为字段名是重复的


任何帮助都将不胜感激。

您需要一个抽象属性:

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

protected abstract int Power { get; }

public class Lancer:Soldier {

    protected override int Power { get { return 5; } }
}
如果您确实不喜欢属性,也可以使用“GetPower”方法。正如您所发现的,如果基类方法需要访问数据,则必须在基类中声明该数据


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

为什么不在基类中放置一个
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;
    }
}
一些设计意见:

  • 您是否需要为
    Archer
    Lancer
    使用不同的类,或者它们可以是配置不同的
    Soldier
    s
  • 最好从数据源中提取这样的属性值,而不是在源代码中硬编码它们。您可以嵌入一个XML文件或其他不易编辑的东西

为每个类添加构造函数,并在创建时传回父类one@TamásSzabó从我的键盘上抄下了单词。您无需为属性/属性的不同值创建新类。@JNYRanger虽然我同意,但这可能过于简化了。因此,在“士兵创建士兵构造函数并等待电源参数”中,以及在创建archer用10创建基础时,AttackPower属性与您的电源属性完全相同。正如我在问题中所说,我已经考虑过在派生类中实现属性(我认为它们必须是抽象的),这是我重视的解决方案。尽管如此,嵌入XML文件的想法还是很好的,我想我会这么做的。我仍然需要考虑一个单独的士兵类是否会起作用,或者我需要不同的类(拥有不同类的主要原因是能够分别配置它们,但我认为XML文件解决了这一需要)