如何强制派生类包含具有默认值的某些属性

mik*_*dev 8 c# abstract-class derived-class

我有一个角色扮演游戏的类结构,看起来像这样......

public abstract class Item
{
   public abstract string Name { get; set; }
}

public abstract class Armor : Item
{
   public override string Name { get; set; }
}

public class Helmet : Armor
{
   public override string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我试图强制每个派生类型包含"名称"属性.这是最好的方法吗?我知道我可以从Item.Name中删除"abstract",然后删除Armor和Helmet中的重写"Name"属性.如果我这样做,代码看起来有点干净,但我可能忘记在这些派生类中设置base.Name.

有人可以帮我告诉我最好的方法吗?

编辑:对不起,让我再澄清一下我的问题.我想确定两件事.1)Name属性存在于所有派生类中2)Name属性不为null或为空

我基本上想强制任何派生自Item(并且不是抽象)的类具有Name的值.

Dav*_*all 9

听起来你担心初始化属性?

但我可能忘记在这些派生类中设置base.Name.

可以强制设置Name属性的一种方法是在基类构造函数中包含此setter,如下所示:

public class MyBaseClass
{
    private string _name;

    public MyBaseClass(string name)
    {
        _name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,从MyBaseClass派生的所有内容都必须满足该构造函数:

public class MyDerivedClass
{
    public MyDerivedClass(string name) : base(name)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

然后你也可以制作酒店:

  • abstract以确保它在每个派生类中都有自己的实现
  • 虚拟以提供基本实现以及所有要覆盖的实现.

我不打算冒险上面是否是好的设计,但它可以确保所有派生类在实例化时具有有效的name属性.

正如其他答案所暗示的,另一种方法是实现在其基本实现中抛出异常的虚拟属性.