c# - 公开 protected 字段的最佳方式

标签 c# properties field

我有一个这样的基类:

 public class BaseModalCommand
 {

    protected object m_commandArgument;
    protected int m_commandID;
    protected int m_enableUIFlags;

    public virtual void OnIdle()
    {
    }

    public virtual void OnResume()
    {
    }

    public virtual void OnStart(int commandID, object argument)
    {
    }

    public virtual void OnStop()
    {
    }



    public virtual int EnableUIFlags
    {
        get
        {
            return this.m_enableUIFlags;
        }
    }
}

虚方法将在派生类型中被覆盖。如果我通过 FxCop 运行它,它会提示未声明可见实例字段并建议将其更改为私有(private)并将其公开为 protected 属性。

有什么想法吗?我认为可以忽略此消息。

最佳答案

对于任何类,客户端代码有两种用途:引用您的类的代码和继承您的类的代码。人们普遍认为,第二种用法是迄今为止耦合最紧密的。你类(class)的变化直接影响他们的内部机制。像这样公开 protected 成员意味着基类中的更改将影响派生类的工作方式,如果不比较每个基类和派生类的代码,这种方式是不可预测的。同样糟糕的是,您的派生类可以修改基类的内部结构。

如果您真的想像这样公开内部数据成员,请将私有(private)数据成员包装在 protected 属性中(如 gisresearch 建议的那样)。这些属性(以及任何 protected 方法)构成了您的类的继承接口(interface)。与任何暴露给外部客户的接口(interface)一样(无论是通过定义公共(public)方法和属性,还是通过显式接口(interface)实现),这个接口(interface)是您需要管理的东西,尤其是在较大的代码库中。界面可以更改,但应作为有意识的决定进行更改。

如果您直接使用 protected 数据成员,您对基类和派生类之间的依赖关系的控制就会少得多。相信我:甚至无法确定更改可能产生的影响可能是一件非常不愉快的事情。

关于c# - 公开 protected 字段的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778773/

相关文章:

java - android中通过service实现sip

c# - 如何在 C# 中一次分配多个对象属性?

c# - 在虚拟方法上使用 OpCodes.Call 是否安全?

c# - 添加属性的默认实现

java - 类属性声明,属性属性的顺序(最终、私有(private)、静态、类型)

java - 推荐 Java 字段 validator

Canvas 元素上的 HTML 文本字段

c# - if 语句后的变量声明

java - 应该将什么传递给此方法 (Field#get(Object obj))?

python - 适当的类和属性结构