【问题标题】:What is the best way to implement a property that is readonly to the public, but writable to inheritors?实现对公众只读但对继承者可写的属性的最佳方法是什么?
【发布时间】:2010-09-18 04:58:38
【问题描述】:

如果我想让继承者写入一个属性,但在外部保持只读,那么实现它的首选方法是什么?我通常会这样:

private object m_myProp;
public object MyProp
{
    get { return m_myProp; }
}
protected void SetMyProp(object value)
{
    m_myProp = value;
}

有没有更好的办法?

【问题讨论】:

    标签: c# .net properties readonly


    【解决方案1】:
    private object m_myProp;
    public object MyProp
    {
        get { return m_myProp; }
        protected set { m_myProp = value; }
    }
    

    或者在 C# 3.0 中

    public object MyProp {get; protected set;}
    

    【讨论】:

    • 如果需要使用任何Interlocked 方法,protected 字段将被证明是优越的。我觉得奇怪的是 C# 公开了与事件同名的事件委托,但根本不公开自动属性支持变量。
    【解决方案2】:

    拥有一个 setter 和 getter 并不比拥有一个可见性级别的变量更好。

    因此,您可以将变量本身设为受保护,并将读取器设为公开。

    也就是说,setter 和 getter 是糟糕的 OO 的一个指标——你确定你需要它们吗?您应该要求对象对其成员执行某些操作,而不是要求其获取其成员然后在对象外部操作它们。

    这是一个非常普遍的规则,也有很多例外。

    【讨论】:

    • 废话; getter/setter 比受保护的字段明显好。 Getter/setter 不是不良 OO 的指标:它们表现出封装性并允许多态性(通过虚拟) - 你想要什么样的 OO?
    • 它们仍然暴露了你的类的实现,并且表明你正在获取数据而不是要求一个类为你做一个操作。那不是 OO,这是程序程序员在真正获得 OO 之前使用的假 oo。
    • 如果你有兴趣,这里有一篇关于它的好文章:javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html
    • 我还没准备好说这篇文章在每个细节上都是错误的,但在我检查的每个细节上都是错误的。
    • @Bill K:不;访问器(get/set)是方法;调用者调用方法来要求班级做某事......我同意罗伯特的观点:那篇文章有点,呃,错了。如果你想要一个不可变的类,那很好——但你需要能够检查状态。
    【解决方案3】:

    这绝对是要走的路。

    public object MyProp {get; protected set;}
    

    如果您使用的是旧版本的 C#,那么这是要走的路。

    private object _myProp;
    public object MyProp
    {
        get { return _myProp; }
        protected set { _myProp = value; }
    }
    

    【讨论】:

    • 如果你使用的是非常旧的 C# 版本,你必须有一个单独的受保护的 Set 方法:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2012-11-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多