【问题标题】:How to assign value to readonly field in an abstract class?如何为抽象类中的只读字段赋值?
【发布时间】:2011-03-24 14:12:20
【问题描述】:

我在基本抽象类中有一个字段。我想将此字段设置为只读,以便在初始化子类后其值不会更改。

但是抽象类不能有构造函数,只读只能从构造函数初始化。

如何做到这一点?

【问题讨论】:

    标签: c# class abstract


    【解决方案1】:

    例如,您可以像这样从子类构造函数调用基类的构造函数:

    基类中的只读字段和构造函数:

    public readonly int MyInt;
    
    protected TheBaseClass(int myInt)
    {
        this.MyInt = myInt;
    }
    

    子类中的构造函数:

    public TheChildClass() : base(42)
    {
    }
    
    public TheChildClass(int i) : base(i)
    {
    }
    

    【讨论】:

    • 是的,这是正确的模式;)。注意:子类也可以是抽象的。
    • Aliostad 打败了我,但我也留下了这个答案,因为这是一个小的变体,您可以使用子类构造函数中的参数调用基类构造函数。
    • 你可以扩展它,并像这样传播参数化的ctor:public TheChildClass(int i) : base(i) { ... }
    • @Abel:确实如此。我也会更新答案以显示该选项:)
    【解决方案2】:

    abstract可以有构造函数。

    public abstract class MyAbstract
    {
    
        protected readonly string SomeField;
    
        public MyAbstract()
        {
            SomeField = "Some";
        }
    }
    
    public abstract class MyInheited
    {
    
    
        public MyInheited(): base()
        {
        }
    }
    

    如果我是你,我会拥有字段不是只读受保护字段,而是将其公开为公共只读属性

    【讨论】:

    • 为什么?拥有 protected readonly 字段的完全正当理由。例如。想要在服务层的 API 中隐藏 DbContext 对象。
    【解决方案3】:

    抽象类可以有一个构造函数,它们根本不能被初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2019-03-23
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      相关资源
      最近更新 更多