gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:29:00 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com