You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何将抽象类作为变量类型?遇栈溢出异常求助

问题原因与解决方法

错误原因

  1. 无限递归调用:在Test类的ResultData属性get访问器中,你直接执行ResultData.Values = true;,这里的ResultData就是当前属性本身,每次访问都会触发get方法,形成无限递归,最终耗尽栈内存抛出StackOverflowException。
  2. 抽象类无法实例化:Results是抽象类,你没有提供具体的实现类,根本无法直接创建它的实例,这也是代码逻辑上的致命问题。

解决步骤

1. 实现Results的具体子类

首先需要创建一个继承自Results的具体类,实现其抽象属性:

public class ConcreteResults : Results
{
    public override bool Values { get; set; }
    public override string ValuesDescription { get; set; }
}

2. 修改Test类,避免递归并正确初始化实例

在Test类中声明私有字段存储ConcreteResults实例,通过字段而非属性本身来操作数据,避免递归:

public class Test : Plugin
{
    // 私有字段存储结果实例
    private ConcreteResults _resultData;

    public Test()
    {
        // 在构造函数中初始化实例并赋值
        _resultData = new ConcreteResults();
        _resultData.Values = true;
        _resultData.ValuesDescription = "Lorem Ipsum result in numeric format";
    }

    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 { return _resultData; }
    }

    public override bool Init(string Symbol)
    {
        return true;
    }
}

可选:懒加载初始化

如果希望在第一次访问ResultData时才初始化实例,可以改用懒加载逻辑:

public override Results ResultData
{
    get 
    {
        if (_resultData == null)
        {
            _resultData = new ConcreteResults();
            _resultData.Values = true;
            _resultData.ValuesDescription = "Lorem Ipsum result in numeric format";
        }
        return _resultData;
    }
}

关键注意点

  • 抽象类仅作为基类定义规范,必须由具体子类实现所有抽象成员后才能实例化。
  • 属性的get/set访问器中,禁止直接访问属性本身(除非是在set里调用get的特殊场景),否则必然引发无限递归。

内容的提问来源于stack exchange,提问作者DPZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:46:12