我有一个角色扮演游戏的类结构,看起来像这样......
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/