是一个抽象类,字段被认为不是一个好习惯?

时间:2015-07-09 16:29:33

标签: c# .net naming-conventions abstract-class field-names

我创建了一个实现接口的抽象类。这个抽象类将是几个需要填充该接口属性的具体类的基础。

前两个示例中会弹出CLR合规性警告。我理解他们代表什么,这里有几个问题涵盖了他们。

为了使字段不同,我可以添加一个尾随下划线。它被编译器接受。这是一个正确的风格选择。我认为它不是很突出,可能是代码味道。但我可能不习惯它。

或者我错误地创建了一个定义属性字段的抽象祖先?当然,这个想法是为了保存重复工作并帮助实施标准实现,但我可以看到,当它开始为这些“隐藏”字段赋值时,它可能在后代中有自己的气味。

namespace MyLittleCompany.Widgety
{
  public abstract class MlcWidgetInformation : IMlcWidgetInformation
  {
    //Compiler complains of Non-CLR Compliance (case difference only)
    protected int sides;  //Number of sides for this widget

    //Compiler complains of Non-CLR Compliance (non-private name with underscore
    // is not compliant)
    protected int _hooks; //Number of hooks on this widget

    //Compiler is happy with a trailing underscore
    protected int feathers_; //Number of feathers on this widget

    // Interface items
    public Sides { get { return sides; } } 
    public Hooks { get { return _hooks; } }
    public Feathers { get { return feathers_; } }
  }
}
=====================================
namespace MyLittleCompany.Widgety
{
  public class SmallWidgetInformation : MlcWidgetInformation 
  {
    public SmallWidgetInformation()
    {
      // Is this a smell? As in "What are these things?"
      sides = 6;
      _hooks = 3;
      feathers_ = 1;
     }
  }
}        

2 个答案:

答案 0 :(得分:2)

绝对接受在抽象类中创建受保护字段。

命名约定仅供参考,它取决于您使用的样式工具。使用您和/或您的团队预先设定的样式并从中自定义您的工具。最重要的是项目本身是一致的。

我个人以前从未见过使用中的尾随下划线,但我可以看到其中的好处。可能是一种非常聪明的方式来显示受保护的字段。如果我遇到一个使用它的团队,我肯定会批准该惯例。

答案 1 :(得分:2)

为了避免重复定义三个字段而必须创建一个抽象基类并不是代码味道,但是:

  1. 确实感觉就像把DRY带到了极端,
  2. 和(假设您在其他地方使用继承),阻止了从其他类继承的机会。
  3. 但是,如果您愿意/能够使用VS2015和C#6,那么帮助即将到来。新的只读自动属性允许您执行此操作,无需重复即可删除对基类的需求:

    public interface IMlcWidgetInformation
    {
        int Sides { get; }
        int Hooks { get; }
        int Feathers { get; }
    }
    
    public class SmallWidgetInformation : IMlcWidgetInformation
    {
        public int Sides { get; } = 6;
        public int Hooks { get; } = 3;
        public int Feathers { get; } = 1;
    }
    

    在C#6被广泛采用之前,你要在继承和重复之间做出选择。

相关问题