如何在三元运算符中创建继承自抽象类的类型实例?
在三元运算符中创建继承类型实例的方法
没问题,这事儿其实挺 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
相关产品推荐
相关产品推荐

