从具体子类向抽象类提供值的“正确”方法是什么?
即,我应该这样做吗:
abstract class A {
private string m_Value;
protected A(string value) {
m_Value = value;
}
public string Value {
get { return m_Value; }
}
}
class B : A {
B() : this("string value") {}
}
或者这个:
abstract class A {
protected A() { }
public abstract string Value { get; }
}
class B : A {
B() {}
public override string Value {
get { return "string value"; }
}
}
还是别的?
如果 Value
属性只用在抽象类中,应该做不同的事情吗?
最佳答案
我通常更喜欢第一种方法,因为它在子类中需要的代码更少。
但是,我承认第二种方法的语义在某种程度上更清晰。覆盖属性表示“此属性的实现是我的身份的一部分。”传递构造函数参数具有不同的含义:“我正在为另一个东西设置一个值,它恰好是我的基类。”它意味着组合 (has-a) 而不是继承 (is-a)。
And should different things be done if the Value property is only used in the abstract class?
在这种情况下,您绝对应该使用第一种(面向构造函数的)方法,这样您就可以对子类隐藏该实现细节。
同样,如果你需要在构造函数中使用该值;作为Marc mentioned这是使用第一种方法的实际技术原因。虽然在这种特定情况下这无关紧要,但如果有人稍后修改属性覆盖以使用派生类中的某些其他成员变量,您可能会遇到一个微妙的错误。
关于c# - 从子类提供抽象类成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1674954/