我有一个抽象基类,我想声明一个字段或一个属性,该属性将在从该父类继承的每个类中具有不同的值。
我想在基类中定义它,以便可以在基类方法中引用它-例如,重写ToString表示“此对象的属性/字段类型”。我可以看到三种方式来执行此操作,但是我想知道-最佳或公认的方式是什么?新手问题,对不起。
选项1:
使用抽象属性,并在继承的类上重写它。这得益于强制执行(您必须覆盖它)并且它很干净。但是,返回一个硬代码值而不是封装一个字段感觉有点错误,这是几行代码而不是仅仅几行。我还必须声明一个用于“ set”的主体,但这并不重要(而且可能有一种避免我不知道的主体的方法)。
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
选项2
我可以声明一个公共字段(或一个受保护的字段),并在继承的类中显式覆盖它。下面的示例将警告我使用“ new”,我可能可以这样做,但是感觉不对,它破坏了多态性,这就是重点。似乎不是个好主意...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
选项3
我可以使用一个受保护的字段并在构造函数中设置值。这看起来很整洁,但是依靠我确保构造函数始终设置该值,并且对于多个重载的构造函数,总有一些代码路径不会设置该值的机会。
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
这是一个理论问题,我想答案必须是选择1,因为它是唯一安全的选择,但是我刚开始接触C#,并想问更多有经验的人。