C#中如何将抽象类作为变量类型?遇栈溢出异常求助
问题原因与解决方法
错误原因
- 无限递归调用:在
Test类的ResultData属性get访问器中,你直接执行ResultData.Values = true;,这里的ResultData就是当前属性本身,每次访问都会触发get方法,形成无限递归,最终耗尽栈内存抛出StackOverflowException。 - 抽象类无法实例化:
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
相关产品推荐
相关产品推荐

