当你有一个变量在对象实例化时是已知的,并且在之后不应该被改变时,应该使用只读字段。
但是,不允许从子类的构造函数中分配只读字段。如果超类是抽象的,这甚至不起作用。
有没有人能很好地解释为什么这不是一个好主意,或者缺乏C#语言?
abstract class Super
{
protected readonly int Field;
}
class Sub : Super
{
public Sub()
{
this.Field = 5; //Not compileable
}
}
PS:当然,你可以通过在超类的受保护构造函数中分配只读字段来达到同样的效果。
发布于 2011-10-10 04:59:52
public class Father
{
protected readonly Int32 field;
protected Father (Int32 field)
{
this.field = field;
}
}
public class Son : Father
{
public Son() : base(5)
{
}
}
你可以尝试一下这样的东西!
发布于 2011-10-10 05:05:22
我会用C#中的抽象/虚拟属性对此进行建模。
abstract class Super {
protected abstract int Field { get; }
}
class Sub : Super {
protected override int Field { get { return 5; } }
}
在我看来,这是一个比构造函数包含每个只读字段作为参数更好的解决方案。首先,因为编译器也能够内联这一点,还因为构造函数解决方案在派生类中看起来像这样:
class Sub : Super {
public Sub() : base(5) { } // 5 what ?? -> need to check definition of super class constructor
}
而且,如果您已经有一个只接受一个int值的构造函数,那么这可能就不起作用了。
发布于 2011-10-10 05:00:27
我认为主要原因是所有.NET语言实现都增加了复杂性
此外,总是有一个简单的解决方法:
abstract class Super
{
protected readonly int Field;
protected Super(int field)
{
this.Field = field;
}
}
class Sub : Super {
public Sub():base(5)
{
}
}
https://stackoverflow.com/questions/7706426
复制相似问题