gpt4 book ai didi

c# - 基类能否确定派生类是否覆盖了虚拟成员?

转载 作者:太空狗 更新时间:2023-10-29 21:20:53 25 4
gpt4 key购买 nike

这是我的类(class)的简化版本:

public abstract class Task
{
private static object LockObject = new object();

protected virtual void UpdateSharedData() { }
protected virtual void UpdateNonSharedData() { }

public void Method()
{
lock(LockObject)
{
UpdateSharedData();
}
UpdateNonSharedData();
}
}

我试图对派生类隐藏锁定代码。但是我只想在派生类重写UpdateSharedData时获取锁;如果没有,我不希望该方法在更新非共享数据之前阻止并等待所有其他正在运行的实例更新共享数据。

因此,Method 要做的(看似)显而易见的事情是检查并查看当前实例的 UpdateSharedData 实现是否覆盖了基类的实现。我敢肯定,如果不使用反射,这是不可能的,而且这样做可能不可取。

我已经想到了一些解决方法,但它们都很尴尬:

  • 添加派生类的构造函数设置的 protected bool 属性,并检查该属性以查看是否需要锁定。从派生类中隐藏锁定代码的工作非常糟糕。
  • 使 UpdateSharedData 方法成为委托(delegate)属性,设置任何派生类在其构造函数中将属性传递给私有(private)方法,并且仅在委托(delegate)不为 null 时才获取锁。这样好多了,但仍然有点糟糕。

最佳答案

如果您定义了一个抽象任务和一个 IHasSharedData 接口(interface),那么在方法中您会在执行锁定之前检查派生任务是否实现了 IHasSharedData。只有实现接口(interface)的类才需要等待。我意识到这避免了回答实际问题,但我认为这将是比使用反射更简洁的解决方案。希望您能为接口(interface)找到一个更好的名称,该名称更接近于类的实际作用。

public interface IHasSharedData
{
void UpdateSharedData();
}

public abstract class Task
{
private static object LockObject = new object();

protected virtual void UpdateNonSharedData() { }

public void Method()
{
if (this is IHasSharedData)
{
lock(LockObject)
{
UpdateSharedData();
}
}
UpdateNonSharedData();
}
}

public class SharedDataTask : Task, IHasSharedData
{
public void UpdateSharedData()
{
...
}
}

关于c# - 基类能否确定派生类是否覆盖了虚拟成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/518994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com