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

如何在三元运算符中创建继承自抽象类的类型实例?

在三元运算符中创建继承类型实例的方法

没问题,这事儿其实挺 straightforward 的,只要保证你的两个子类能通过一致的参数构造,并且三元运算符两边的实例能统一到父类(也就是你的LocationDetector抽象类)就行。我给你一步步拆解:

首先,先确认你的两个子类都正确实现了和抽象类匹配的构造函数——因为抽象类的构造是protected,子类必须通过: base(...)调用它。比如假设你的两个子类是AreaLocationDetector和PointLocationDetector,它们的构造应该是这样的:

public class AreaLocationDetector : LocationDetector
{
    public AreaLocationDetector(MonitoredLocation monitoredLocation) 
        : base(monitoredLocation) { }

    public override void Detect(IEnumerable<LocationDto> locations)
    {
        // 你的区域检测逻辑
    }
}

public class PointLocationDetector : LocationDetector
{
    public PointLocationDetector(MonitoredLocation monitoredLocation) 
        : base(monitoredLocation) { }

    public override void Detect(IEnumerable<LocationDto> locations)
    {
        // 你的点位检测逻辑
    }
}

接下来,就可以直接在三元运算符里创建实例了。核心是让运算符两边的实例都隐式转换为父类LocationDetector,这样编译器就能识别统一的返回类型。示例代码如下:

// 先准备构造需要的参数
MonitoredLocation targetLocation = GetTargetMonitoredLocation(); 

// 你的判断条件,比如根据配置或者业务逻辑选择检测器类型
bool isAreaMonitoring = CheckIfAreaMonitoringNeeded();

// 用三元运算符创建实例
LocationDetector detector = isAreaMonitoring
    ? new AreaLocationDetector(targetLocation)
    : new PointLocationDetector(targetLocation);

关键注意事项

  • 构造参数一致性:三元运算符两边的构造调用必须使用相同数量和类型的参数,否则编译器会报错。如果你的两个子类构造参数不同,要么调整子类构造统一参数,要么考虑用工厂方法封装创建逻辑。
  • 类型统一:确保两边的实例都能转换为同一个父类型(这里就是LocationDetector),如果有需要,也可以显式转换,但一般隐式转换就够了。
  • 复杂逻辑拆分:如果创建实例的逻辑很复杂(比如需要额外的初始化操作),建议把这部分抽成工厂方法,再在三元运算符里调用方法,代码会更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:32:21