如何在c#中修饰所有派生方法?

如何在c#中修饰所有派生方法?,c#,inheritance,exception,decorator,C#,Inheritance,Exception,Decorator,我有以下情况: class A { abstract void foo() { } } 许多类继承自A,并重写foo() 我想捕获从那些被覆盖的foos抛出的所有异常 我想装饰A的foo,并尝试捕获foo的所有内容,希望重写类的foo也会装饰为try..catch from baseA的foo 这可行吗?如果是,怎么做? 有更好的方法吗?您可以使用以下方法: public class A { public void Foo()

我有以下情况:

class A
{        
    abstract void foo()
    {
    }
}
许多类继承自
A
,并重写
foo()

我想捕获从那些被覆盖的
foo
s抛出的所有异常

我想装饰
A
foo
,并尝试捕获
foo
的所有内容,希望重写类的
foo
也会装饰为try..catch from base
A
foo

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

您可以使用以下方法:

public class A
{        

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

    protected abstract void DoFoo();

}
因此,你将写:

public class B : A
{        

    protected override void DoFoo()
    {
    }

}

你可以看看这方面可能的方法,为什么要这样做?大多数时候,我喜欢构图而不是继承。例如:让您的“许多”类被另一个能够正确处理异常的类使用。可能一个接口就可以了……所有重写
foo
的类都无权访问DoFoo,也不会运行您建议的代码。我试图不改变他们的代码。这个解决方案破坏了它们,所以我知道这是不可能的。你要求修改不可修改的代码,如果我理解。。。这可能是不可能的。我只想更改一个,而不是它的所有派生类和客户端代码。我基本上也在考虑@OlivierRogier的建议,我很确定他是对的-没有任何解决方案可以满足您的需要,也不涉及对继承类的更改。想想看,在您当前的实现中,执行从未在
A
中输入任何代码,因此您在
A
中所做的任何更改都不会影响任何内容。@Gulzar如果您能够控制代码,您可以做的一件事是首先使用visual studio重命名工具在dofoo中重命名foo,然后添加建议的foo。所以从调用foo的外部类来看,没有任何更改…客户端的代码看不到任何更改。。。这就是重构。您应该将新的public dofoo更改为protected,这是您说不想做的困难部分,因为VS还没有这个工具,但它不是必需的,您可以让可访问性级别保持原样。所以你可以在几秒钟内完成这项工作。