Oop 只读属性继承:抽象或集保护

Oop 只读属性继承:抽象或集保护,oop,inheritance,properties,Oop,Inheritance,Properties,假设类A是抽象的,定义了类B继承的只读属性,而类B必须提供这些属性。将此类属性定义为抽象属性或集合保护属性是否更好: public abstract class A { public abstract int Value { get; } } public class B : A { public override int Value { get { return 1; } } } 或 我认为第一种解决方案可能更好,但我想听听其他意见。这取决于只读的含义。如果您的意思是对呼叫者

假设类A是抽象的,定义了类B继承的只读属性,而类B必须提供这些属性。将此类属性定义为抽象属性或集合保护属性是否更好:

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


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

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

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

对于第二种解决方案,整个值接口由基类定义,这很好,而子类在选择时仍然能够设置值,这也很好


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

我接受您的答案,因为它有一些优点,没有其他人做出贡献。然而,在此期间,我最终使用了解决方案1。考虑下面的使用解决方案2:一个第三级C继承自B,并且它也想暴露这个值。此外,值不是常量,而是由B和C中的许多方法设置的。可能会发生这样的情况:B在执行其方法时提供其值,而不是C应该提供的值。换句话说,C没有正确地重写该属性。所以我得出结论,解决方案1通常更合适。
public abstract class A
{
    public int Value { get; protected set; }
}
public class B : A
{
    public B()
    {
        Value = 1;
    }
}