【发布时间】:2019-08-28 20:28:17
【问题描述】:
我正在尝试稍微扩展 Process 类,以添加 Process.Exited 委托的访问控制并将它们限制为一个。到目前为止,我有这个结果:
public class ProcessWithData : Process
{
public EventHandler CurrentEventHandler { get; private set; }
public new bool EnableRaisingEvents = true;
private new EventHandler Exited;
public void SetHandler(EventHandler eventHandler)
{
if (CurrentEventHandler != null) Exited -= CurrentEventHandler;
CurrentEventHandler = eventHandler;
Exited += CurrentEventHandler;
}
}
但是,行
private new EventHandler Exited;
覆盖作为基础的 Process 类的现有 EventHandler。因此
var proc = Process.Start("foo.exe");
ProcessWithData procwithdata = (ProcessWithData)proc;
应该在施放时销毁 Exited 事件处理程序。
如何在不重新定义(和销毁)Process 类中的现有实例的情况下为其设置private 修饰符?
【问题讨论】:
-
如果你也展示了
Process类,这会有所帮助。目前尚不清楚您要做什么,或者您如何达到Exited以某种方式被破坏的期望。也许你不需要重新声明Exited;也许您需要在基类中将其设为虚拟并override它。还没有办法知道。 -
@madreflection 这是标准的 System.Diagnostics.Process 类(定义为here)。
-
注意到了,我有点惊讶课程不是
sealed。无论如何,Process不可能转换为ProcessWithData,因为Process.Start无法为您提供它的实例。你最初想达到什么目标? -
我的蜘蛛侠直觉告诉我,您希望
ProcessWithData成为Process的包装器(或者如果可能的话,也可以是装饰器)。 -
“如何在不重新定义(和销毁)Process 类中的现有实例的情况下为其设置私有修饰符?” - 你不能,请参阅标记的重复项。即使语言通常允许这样做,您仍然不能,因为基本成员不是虚拟的。您唯一的选择是无论如何都隐藏它(不是“破坏”......它仍然存在,可以通过使用类型为基类的引用来获得)。至于替代方案,对于 Stack Overflow 的格式来说,寻址范围太广了。如果您需要具体方面的帮助,请随时发布新问题。