【问题标题】:How to change access modifier without hiding class base variable? [duplicate]如何在不隐藏类基变量的情况下更改访问修饰符? [复制]
【发布时间】: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 的格式来说,寻址范围太广了。如果您需要具体方面的帮助,请随时发布新问题。

标签: c# casting process


【解决方案1】:

我同意@madreflection 的观点,认为包装器或装饰器是可行的方法。也就是说,使用base 设置有问题的属性将起作用。

public class ProcessWithData : Process
{
    public ProcessWithData(string filename)
    {
        base.StartInfo.FileName = filename;
    }

    public EventHandler CurrentEventHandler { get; private set; }

    public void SetHandler(EventHandler eventHandler)
    {
        // set Exited via base object
        if (CurrentEventHandler != null) base.Exited -= CurrentEventHandler;
        CurrentEventHandler = eventHandler;
        base.Exited += CurrentEventHandler;
    }
}

...并像这样使用它,它有点冗长但它有效...

var proc = new ProcessWithData("foo.exe");
        proc.SetHandler(ProcOnExited);
        proc.EnableRaisingEvents = true;
        proc.Start();

private void ProcOnExited(object sender, EventArgs e)
{
    // do stuff
}

【讨论】:

  • 正确解释,我终于明白了这个问题。我的目标是将访问修饰符更改为基类中的一个元素,这就是为什么使用“new”让我认为它正在覆盖它——并在强制转换时有效地消失。类永远不应该与以这种方式启动进程的一般方式一起使用 - 而不是添加到使用Process.GetProcessesByName 找到的实例,但有问题的示例是在测试构建中。
猜你喜欢
  • 2014-09-10
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2014-12-11
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多