【发布时间】:2023-03-31 17:45:01
【问题描述】:
我有一种情况,我根据收到的数据创建了一个名为 EntryEvent 的对象。必须解析该数据。基本事件应该开始解析通过构造函数接收并提供给对象的数据。子类型知道如何解析该特定数据集。现在,在编译所述代码时,我收到警告 CA2214,它包含对虚拟方法的调用链。虽然产生不可预见的后果可能很糟糕,但我不知道如何获得所需的行为:解析接收到的事件,而无需从外部调用额外的“解析”方法。
有问题的代码是:
public abstract class BaseEvent
{
protected BaseEvent(object stuff)
{
this.ParseEvent();
}
protected abstract void ParseEvent();
}
public class EntryEvent : BaseEvent
{
public EntryEvent( object stuff )
: base( stuff )
{
}
protected override void ParseEvent()
{
// Parse event
}
}
【问题讨论】:
-
你能给我们更多的背景信息吗?有多种方法可以解决这个问题,但不会导致问题,但哪种方法最好取决于上下文。想象一个不需要需要覆盖
ParseEvent的子类是否合理?每个子类实际上是否有一个静态方法,该方法被赋予数据,解析它,然后调用构造函数来获取已经解析的数据? -
在您问题的代码中,
ParseEvent()可以是非虚拟的,仅为EntryEvent定义,并直接从EntryEvent的构造函数中调用。如果您的真实代码无法做到这一点,您能否更新您的问题以更好地说明您正在处理的场景? -
@JonSkeet 该事件来自外部来源。每个子类都需要重写,因为每个子类都需要进行自己的解析。基类保存每个事件提供的一般数据。我的意图是强制特定事件的实现者实现解析器,而不是强制他实际调用它。我想要避免的是给实现者(即使是我)随机命名解析方法的选项,不管它是静态的还是非静态的,但也许我过度分析了它。
-
@private_meta:构造一个事件而不解析任何东西是否有意义,即使这主要用于测试?尚不清楚解析是否真的固有存在于事件对象中,或者它是否只是通常发生的情况。考虑制作获取原始数据的构造函数(即使它们只是私有/受保护的),而不是在构造函数中解析 in。如果有用的话,我可以举个例子。
-
@JonSkeet 构造函数中提供的数据是通过 c++ 设备库从设备获取事件数据的句柄,因此其目的是不必在事件之外进行设备处理。跨度>