首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >readonly-作为子类构造函数的目标的字段

readonly-作为子类构造函数的目标的字段
EN

Stack Overflow用户
提问于 2011-10-10 04:41:25
回答 4查看 4.9K关注 0票数 20

当你有一个变量在对象实例化时是已知的,并且在之后不应该被改变时,应该使用只读字段。

但是,不允许从子类的构造函数中分配只读字段。如果超类是抽象的,这甚至不起作用。

有没有人能很好地解释为什么这不是一个好主意,或者缺乏C#语言?

代码语言:javascript
复制
abstract class Super
{
    protected readonly int Field;
}

class Sub : Super 
{
    public Sub()
    {
        this.Field = 5; //Not compileable
    }
}

PS:当然,你可以通过在超类的受保护构造函数中分配只读字段来达到同样的效果。

EN

回答 4

Stack Overflow用户

发布于 2011-10-10 04:59:52

代码语言:javascript
复制
public class Father
{
    protected readonly Int32 field;

    protected Father (Int32 field)
    {
        this.field = field;
    }
}

public class Son : Father
{
    public Son() : base(5)
    {

    }
}

你可以尝试一下这样的东西!

票数 11
EN

Stack Overflow用户

发布于 2011-10-10 05:05:22

我会用C#中的抽象/虚拟属性对此进行建模。

代码语言:javascript
复制
abstract class Super {
  protected abstract int Field { get; }
}

class Sub : Super {
  protected override int Field { get { return 5; } }
}

在我看来,这是一个比构造函数包含每个只读字段作为参数更好的解决方案。首先,因为编译器也能够内联这一点,还因为构造函数解决方案在派生类中看起来像这样:

代码语言:javascript
复制
class Sub : Super {
  public Sub() : base(5) { } // 5 what ?? -> need to check definition of super class constructor
}

而且,如果您已经有一个只接受一个int值的构造函数,那么这可能就不起作用了。

票数 2
EN

Stack Overflow用户

发布于 2011-10-10 05:00:27

我认为主要原因是所有.NET语言实现都增加了复杂性

此外,总是有一个简单的解决方法:

代码语言:javascript
复制
 abstract class Super
 {
     protected readonly int Field;

     protected Super(int field)
     {
          this.Field = field;
     }
 }


class Sub : Super {
   public Sub():base(5)
   {
   }

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7706426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档