c# - 将行为添加到相互调用的重写重载
问题描述
假设我正在使用具有非密封类的库。我知道类的接口,但不知道它的实现。有点像这样:
public class LibraryClass
{
public virtual void DoStuff()
{
//Unknown implementation
}
public virtual void DoStuff(int value)
{
//Unknown implementation
}
}
我想使用这个类,但将我自己的行为添加到每个DoStuff
重载的调用中。一个显然天真的方法是:
public class MyClass : LibraryClass
{
public override void DoStuff()
{
Console.WriteLine("Called");
base.DoStuff();
}
public override void DoStuff(int value)
{
Console.WriteLine("Called");
base.DoStuff(value);
}
}
乍一看,它看起来不错,但如果我DoStuff()
从我的班级打电话,我会看到输出“Called”两次。似乎LibraryClass.DoStuff()
(我只能猜测)的实际实现必须与此类似:
public virtual void DoStuff()
{
DoStuff(0);
}
由于DoStuff(int)
被覆盖,这最终会调用我自己的实现,因此添加的行为最终会被调用两次。
解决此问题的一种方法是仅覆盖DoStuff(int)
,因为无论哪种方式都会调用它,但无法确保此库的某些未来版本不会更改DoStuff()
为不调用DoStuff(int)
。
我也可以做一些复杂的事情,比如:
public class MyClass : LibraryClass
{
private bool isInCall = false;
public override void DoStuff()
{
if (!isInCall)
{
Console.WriteLine("Called");
}
isInCall = true;
base.DoStuff();
isInCall = false;
}
public override void DoStuff(int value)
{
if (!isInCall)
{
Console.WriteLine("Called");
}
isInCall = true;
base.DoStuff(value);
isInCall = false;
}
}
但这似乎有点草率。
有没有更优雅的方法来覆盖所有重载,但确保我添加的代码只执行一次?
解决方案
推荐阅读
- linux - 用于 wxWidgets 的 GdkWindow
- ios - CoreData 上下文在大数据集上保存糟糕的性能
- flutter - 检查类型类列表中的值
- amazon-web-services - 如何仅针对某些 IP 地址在 Kubernetes 中公开 tcp 服务?
- r - 如何将单热编码变量转换为 R 中的单个因素
- flutter - 颤振:使用 Float64List Matrix4 转换 CustomPaint 中的路径
- python - Python 和 C# TcpListener - 无法建立连接,因为目标机器主动拒绝它
- python - 在不平衡的数据集上使用 KNN 时,为什么设置 score='recall' 会将我的所有概率都变成二进制?
- angular - Angular 10匹配器孩子没有显示孩子
- python - 如何在 Django 中订购 URL?由于错误的网址,我收到“找不到页面”错误?