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

时间:2015-02-12 20:49:46

标签: c# inheritance abstract

我正在制作一个游戏,其中我有多种士兵,每种都有自己的属性(速度,攻击力......)。显然,所有这些都可以走路,攻击......所以我认为用这些方法创建一个抽象类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 个答案:

答案 0 :(得分: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”方法。正如您所发现的,如果基类方法需要访问数据,您在基类中声明该数据。

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

答案 1 :(得分: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配置不同?
  • 最好从数据源中提取这样的属性值,而不是在源代码中对它们进行硬编码。您可以嵌入XML文件或其他内容,因此不容易编辑。