【问题标题】:How to decorate all deriving methods in c#?如何在 C# 中装饰所有派生方法?
【发布时间】:2020-02-29 03:03:18
【问题描述】:

我有以下情况:

class A
{        
    abstract void foo()
    {
    }
}

许多类继承自A,并覆盖foo()

我想捕获从那些被覆盖的foos 引发的所有异常。

我考虑过装饰Afoo,并尝试..捕获foo 的所有内容,并希望覆盖类的foos 也可以用try 进行装饰。 .catch 从基地Afoo

这可行吗?如果是这样,怎么做? 有没有更好的办法?

【问题讨论】:

  • 你可以在这个thread看看可能的方法
  • 你为什么要这样做?大多数时候,我更喜欢组合而不是继承。例如:让另一个可以正确处理异常的类使用您的“许多”类。也许一个界面就可以了……

标签: c# inheritance exception decorator


【解决方案1】:

你可以用这个:

public class A
{        

    public void Foo()
    {
      try
      {
        DoFoo();
      }
      catch
      {
      }
    }

    protected abstract void DoFoo();

}

因此你会写:

public class B : A
{        

    protected override void DoFoo()
    {
    }

}

【讨论】:

  • 所有覆盖 foo 的类将无法访问 DoFoo,并且不会运行您建议的代码。我试图不改变他们的代码。这个解决方案破坏了它们。
  • 所以没有办法,据我所知。你要求修改不可修改的代码,如果我理解……这可能是不可能的。
  • 我只想更改 A,而不是其所有派生类和客户端代码。
  • 我基本上也在考虑@OlivierRogier 的建议,我很确定他是对的 - 没有解决方案可以满足您的需求并且不涉及继承类的更改。想想看,在你当前的实现中,执行永远不会在A 中输入任何代码,所以你在A 中所做的任何更改都不会影响任何事情。
  • @Gulzar 如果您可以控制代码,您也许可以做的一件事是首先使用 Visual Studio 重命名工具在 dofoo 中重命名 foo,然后添加建议的 foo。因此,从调用 foo 的外部类中,没有任何改变...客户端的代码没有看到任何变化...这就是 重构。您应该将新的 public dofoo as protected 更改为谨慎,这是您说您不想做的困难部分,因为 VS 还没有这个工具,但它不是必需的,您可以让可访问性级别保持原样.所以你可以在几秒钟内完成这项工作。
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 2019-05-02
  • 2019-07-27
  • 2016-01-19
  • 2019-03-15
  • 2014-06-07
  • 2021-04-16
  • 2020-11-30
相关资源
最近更新 更多