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

前端之家收集整理的这篇文章主要介绍了c# – 强制子类初始化字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有抽象基类,包含一些字段和一些作用于这些字段的方法.例如:
  1. public abstract class A
  2. {
  3. protected double _field;
  4.  
  5. public double SquaredField { get { return _field * _field; } }
  6.  
  7. ... some other abstract methods
  8. }

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

  1. public class B : A
  2. {
  3. public B(double field)
  4. {
  5. _field = Math.Sqrt(field);
  6. }
  7.  
  8. ... some other method implementations
  9. }

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

– 编辑

我最终做的是:

  1. public abstract class A
  2. {
  3. protected readonly double _field;
  4.  
  5. public A(double field)
  6. {
  7. _field = field;
  8. }
  9.  
  10. public double SquaredField { get { return _field * _field; } }
  11.  
  12. ... some other abstract methods
  13. }
  14.  
  15.  
  16. public class B : A
  17. {
  18. public B(double field) : base(field)
  19. {
  20. }
  21.  
  22. public static B CreateNew(double val)
  23. {
  24. return new B(Math.Sqrt(field));
  25. }
  26.  
  27. ... some other method implementations
  28. }

解决方法

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

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

  1. public abstract class A
  2. {
  3. private readonly double _field;
  4.  
  5. public double SquaredField { get { return _field * _field; } }
  6.  
  7. protected A(double field)
  8. {
  9. _field = field;
  10. }
  11. }

猜你在找的C#相关文章