我有一个抽象基类,我想声明一个字段或属性,在从该父类继承的每个类中将具有不同的值。
我想在基类中定义它,这样我就可以在基类方法中引用它——例如覆盖 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#,并想问有更多经验的人。