oop - OO 编程风格 - 虚拟属性、构造函数参数或 protected setter

标签 oop

如果我有一个基类(下例中的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/

相关文章:

java - 在面向对象编程中,在其方法中引用接口(interface)子项是正确的方法吗?

c++ - 如何在不使用 virtual 的情况下创建装饰器函数

c# - 关于在 session 中存储整个 LINQ 对象的想法?

java - getter 和 setter 的用户输入

c++ - 在 C : Derived to base conversions 中包装 C++

java - 如何使用整数引用枚举以在数组中使用

java - 为抽象类创建对象

php - Python类成员混淆

java - 根据对象属性决定返回哪个 Enum

java - 使工厂方法更具动态性