c# - 在构造函数中覆盖属性或计算属性

标签 c# .net inheritance polymorphism virtual

例如我有一个基类,我需要一个属性 将在派生类中计算。我有两个变体(SomeProperty1SomeProperty2):

public class BaseClass
{
    public int SomeProperty1{get;set;}
    public override int SomeProperty2{get;set;}
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
       SomeProperty1 = 100;
    }
    public override int SomeProperty2
    {
        get
        {
            return 100;
        }
    }
}

问题是什么是最好的方法,SomeProperty1 还是 SomeProperty2

最佳答案

向基类添加一个名为 CalcSomeProperty() 的 protected 抽象方法。

然后根据 CalcSomeProperty() 实现您的属性。这将强制派生类实现它。

例如:

public abstract class BaseClass
{
    public int SomeProperty
    {
        get
        {
            return CalcSomeProperty();
        }
    }

    protected abstract int CalcSomeProperty();
}

或者,您可以将属性本身抽象化:

public abstract class BaseClass
{
    public abstract int SomeProperty { get; }
}

无论哪种情况,您都在强制派生类实现属性计算。

将计算分离到 protected 方法(而不是使用更简单的抽象属性)的一个优点是,如果计算速度慢,您可以在具体属性实现中执行缓存:

public abstract class BaseClass
{
    protected BaseClass()
    {
        _someProperty = new Lazy<int>(CalcSomeProperty);
    }

    public int SomeProperty
    {
        get
        {
            return _someProperty.Value;
        }
    }

    protected abstract int CalcSomeProperty();

    private readonly Lazy<int> _someProperty;
}

关于c# - 在构造函数中覆盖属性或计算属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15741092/

相关文章:

python - 创建返回 pandas dataFrame 的子类表单类

java - java中的getter setter作用域

c# - 创建一组文件的打包二进制表示?

c# - 防止、避免或绕过 AppCrash

c# - 将数字添加到字符串?

.net - 有人可以澄清我对模拟的验证概念的理解吗?

.net - 如何防止类中的属性不存储在 session 中

c# - BulkCopy.WriteToServerAsync() 无法导入记录

C# XPath Soap,如何导航到嵌入式节点

java - 您应该使用父类(super class)构造函数来设置变量吗?