【问题标题】:Read-only properties inheritance: abstract or set-protected只读属性继承:抽象或集保护
【发布时间】:2011-11-16 04:09:11
【问题描述】:

假设类 A 是抽象类并定义了继承自它的类 B 必须提供的只读属性。将这些属性定义为抽象属性还是集保护属性是更好的做法:

public abstract class A
{
    public abstract int Value { get; }
}
public class B : A
{
    public override int Value { get { return 1; } }
}

public abstract class A
{
    public int Value { get; protected set; }
}
public class B : A
{
    public B()
    {
        Value = 1;
    }
}

我认为第一个解决方案可能更好,但我想听听其他意见。

【问题讨论】:

    标签: oop inheritance properties


    【解决方案1】:

    这取决于您所说的只读。如果您的意思是对呼叫者只读,那么我更喜欢第二种解决方案。

    第一个解决方案强制子类实现get,这很好。但它禁止孩子实现set(甚至是受保护的),这很糟糕。

    采用第二种方案,整个Value接口由基类定义,很好,子类在选择的时候仍然可以设置Value,也很好。

    另一方面,如果“只读”是指真正的只读,因为即使是子类也不允许设置值,那么第一个解决方案更好。如果你尝试设置它,你甚至会得到正确的编译错误。

    【讨论】:

    • 我会接受你的回答,因为它有一些优点,没有其他人做出贡献。然而,与此同时,我最终使用了解决方案 1。使用解决方案 2 考虑以下情况:第三个类 C 继承自 B 并且它还希望公开该值。此外,该值不是常量,而是由 B 和 C 中的许多方法设置的。B 可能会在执行其方法之一时提供其值,而不是 C 应提供的值。换句话说,C 没有正确地覆盖该属性。所以我得出结论,解决方案 1 通常更合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2011-01-31
    • 2013-04-18
    相关资源
    最近更新 更多