c# - 如何强制派生类包括具有默认值的某些属性

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

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; }
}

基本上,我试图强制每个派生类型都包含“名称”属性。这是最好的方法吗?我知道我可以从Item.Name中删除“摘要”,然后在Armor和Helmet中删除被覆盖的“Name”属性。如果这样做,代码看起来会更简洁一些,但我可能会忘记在这些派生类中设置base.Name。

有人可以帮我看看做到这一点的最佳方法吗?

编辑:
抱歉,让我再澄清一下我的问题。我想确保两件事。
1)名称属性存在于所有派生类中
2)Name属性不能为null或为空

我基本上想强制从Item(不是抽象的)派生的任何类都具有Name的值。

最佳答案

听起来您是否担心初始化属性?

but I might forget to set the base.Name in these derived classes.



可以强制设置Name属性的一种方法是将此setter包含在基类构造函数中,如下所示:
public class MyBaseClass
{
    private string _name;

    public MyBaseClass(string name)
    {
        _name = name;
    }
}

然后,从MyBaseClass派生的所有内容都必须满足该构造函数:
public class MyDerivedClass
{
    public MyDerivedClass(string name) : base(name)
    {

    }
}

然后,您也可以使该属性:
  • 抽象,以确保它存在于每个派生类中并带有其自己的实现
  • virtual提供一个基本实现,所有这些都将被覆盖。

  • 我不会冒险上述内容是否设计良好,但是可以确保实例化时所有派生类都具有有效的name属性。

    正如其他答案所暗示的,另一种方法是实现一个虚拟属性,该虚拟属性在其基本实现中引发异常。