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

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

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

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

编辑: 对不起,让我再澄清一下我的问题。我想确定两件事。 1) Name属性存在于所有的派生类中 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)
    {

    }
}

然后你也可以使属性:

  • 抽象以确保它存在于每个派生类中并具有自己的实现
  • 虚拟以提供基本实现并覆盖所有它。

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

另一种方法,正如其他答案所建议的那样,是实现一个在其基本实现中抛出异常的虚拟属性。

关于c# - 如何强制派生类包含具有默认值的某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2158028/

相关文章:

c# - 当我无权访问 HttpContext 时,如何填充我的审计日志 UserId 字段?

c# - 一次将datagridview的所有数据插入数据库

c# - 按多个表分组并仍然可以访问原始查询?

python - 对于抽象类来说,实例化的最佳方法是什么?

两个派生类的 C++ 拷贝

c# - Canon TWAIN 扫描仪卡在 'Warming up' 几分钟

c++ - 编译时抽象类处理中的 clang vs gcc

c# - 我在这里需要抽象类或接口(interface)吗(或者两者都不需要)?

c++ - 确保派生类具有适当类型的属性

c# - 具有派生类的 Controller 操作