如何在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 baseA
的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还没有这个工具,但它不是必需的,您可以让可访问性级别保持原样。所以你可以在几秒钟内完成这项工作。