如果我有一个基类(下例中的MyBase
)需要子类来提供/覆盖一个值(Value
),是否有一种首选的实现方式这?我可以想到几种方法,但不太清楚为什么我会选择其中一种。我有一些示例(在 C# 中,但它们可以是任何 OO 语言)。
基类中的具体属性 - 子类可以根据需要设置此值。
public class MyBase
{
protected string Value { get; set; }
protected MyBase()
{
Value = "Default Value";
}
private DoSomethingWithValue()
{
Console.WriteLine(Value);
}
}
public class MySub : MyBase
{
public MySub()
{
Value = "Overridden Value";
}
}
虚拟属性(property) - 子类可以根据需要覆盖它。
public class MyBase
{
protected virtual string Value { get { return "Default Value"; } }
protected MyBase()
{
}
private DoSomethingWithValue()
{
Console.WriteLine(Value);
}
}
public class MySub : MyBase
{
protected override string Value { get { return "Overridden Value"; } }
public MySub()
{
}
}
基类构造函数中的属性集 - 子类可以提供一个值。
public class MyBase
{
protected string Value { get; private set; }
protected MyBase(string value)
{
Value = value;
}
protected MyBase() : this("Default Value")
{
}
private DoSomethingWithValue()
{
Console.WriteLine(Value);
}
}
public class MySub : MyBase
{
public MySub() : base("Overridden Value")
{
}
}
显然其中一些允许改变值或动态计算它。但是,在编译时已知值的情况下,哪种方式更可取,为什么?
最佳答案
如果所有潜在派生类的值在编译时都是已知的,那么为什么要在运行时存储它呢?
更重要的是,当您知道它们都只会返回“常量”;
时,在这里调用虚拟查找完全是浪费,所以我会选择 base 中的具体属性。
关于oop - OO 编程风格 - 虚拟属性、构造函数参数或 protected setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4285726/