加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 强制子类初始化字段

发布时间:2020-12-15 08:08:53 所属栏目:百科 来源:网络整理
导读:我有抽象基类,包含一些字段和一些作用于这些字段的方法.例如: public abstract class A{ protected double _field; public double SquaredField { get { return _field * _field; } } ... some other abstract methods} 我想强制A的所有孩子在他们的构造函
我有抽象基类,包含一些字段和一些作用于这些字段的方法.例如:
public abstract class A
{
    protected double _field;

    public double SquaredField { get { return _field * _field; } }

    ... some other abstract methods
}

我想强制A的所有孩子在他们的构造函数中初始化_field

public class B : A
{
    public B(double field)
    {
         _field = Math.Sqrt(field);
    }

    ... some other method implementations
}

实现这一目标的正确模式是什么?

– 编辑

我最终做的是:

public abstract class A
{
    protected readonly double _field;

    public A(double field)
    {
         _field = field;
    }

    public double SquaredField { get { return _field * _field; } }

    ... some other abstract methods
}


public class B : A
{
    public B(double field) : base(field)
    {
    }

    public static B CreateNew(double val)
    {
         return new B(Math.Sqrt(field));
    }

    ... some other method implementations
}

解决方法

根本不要将字段公开给派生类.相反,创建一个受保护的抽象属性:
public abstract class A
{
    protected double Field { get; }

    public double SquaredField { get { return Field * Field; } }
}

或者,如果字段对于特定实例应始终保持不变,请将其作为构造函数参数并将其保持为私有:

public abstract class A
{
    private readonly double _field;

    public double SquaredField { get { return _field * _field; } }

    protected A(double field)
    {
        _field = field;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读