如何在C#中使用抽象类作为变量类型

问题描述 投票:0回答:1

我尝试在 C# 中使用抽象类作为变量类型,并在尝试读取 ResultData.ValuesDescription 时出现 System.StackOverflowException: 'Exception_WasThrown'

错误
public abstract class Plugin
{
    public abstract string Name { get; }
    public abstract string Description { get; }
    public abstract Results ResultData { get; }
    public abstract bool Init(string Symbol);
}
public abstract class Results
{
    public abstract bool Values { get; set; }
    public abstract string ValuesDescription { get; set; }
}

public class Test : Plugin
{
    public override string Name { get => "Lortem Ipsum Moving Average"; }
    public override string Description { get => "Lorem Ipsum dolor sit amet, consectetur adipiscing elit."; }
    public override Results ResultData {
        get {
            ResultData.Values = true;
            ResultData.ValuesDescription = "Lorem Ipsum result in numeric format";
            return ResultData;
        }
    }
    public override bool Init(string Symbol)
    {
        return true;
    }
}

对发生的事情有什么建议吗?
预先感谢
DPZ

c# abstract-class
1个回答
0
投票

属性(实际上)是一个 getter 和 setter 方法。如果您将

ResultData
属性(及其实现)替换为方法,您很快就会明白为什么会收到 StackOverflowException:

public override Results GetResultData() {
    GetResultData().Values = true;
    GetResultData().ValuesDescription = "Lorem Ipsum result in numeric format";
    return GetResultData();
}

现在你明白发生了什么了吗?您正在尝试从

ResultData
getter 中访问
ResultData
。这样就会运行
ResultData
getter,它会再次运行它,然后再次......

要解决这个问题,您实际上必须在某处存储一个

Results
变量。这被称为“支持场”:

private Results _resultsData = new Results();

public override Results ResultData {
    get {
        _resultsData.Values = true;
        _resultsData.ValuesDescription = "Lorem Ipsum result in numeric format";
        return _resultsData;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.