昨天在工作中遇到了一个非常有趣的问题。
我有 2 个不同的类,名为 Foo 和 Bar。每个人都坐在自己的 C# 库项目中(单独的 dll)。
Bar 包含一个虚方法:
public class Bar
{
public virtual void DoSomething();
}
Foo 在其构造函数中使用 Bar 的实例来设置内部属性:
public Foo (Bar myBar)
{
m_Bar = myBar;
}
显然,Foo 引用了 Bar 的项目。
现在,我有 5 个其他类,每个类也位于其自己的项目/dll 中。我们将它们称为 A、B、C、D 和 E。AE 都是 Bar 类的子类,并且它们中的每一个都包含自己的 DoSomething() 重写实现。因为它们是 Bar 的子类,所以它们中的任何一个都可以作为 Foo 构造函数的参数。
AE 每个都维护 Foo 实例的内部集合。例如,我会在 A 类内部做这样的事情:
myFooCollection.Add(new Foo(this));
由于这个原因,AE 类都需要引用 Foo 的项目/dll。
现在,切换回 Foo 让我们说在构造函数中设置 Bar 属性后,我需要调用该 Bar 的 DoSomething() 方法:
public class Foo (Bar myBar)
{
m_Bar = myBar;
m_Bar.DoSomething();
}
请记住,例如,A 类被用作构造函数的 Bar 参数。我对 DoSomething() 的调用需要执行 A 对该方法的实现。但是,由于构造函数参数属于父类 Bar 并且 Foo 不知道类 AE(我不能在不引起循环依赖的情况下给它一个引用),它将调用父类 Bar 中的虚拟方法。自然的解决方案是在调用之前向下转换到子类:
(A)m_Bar.DoSomething();
但这也是不可能的,因为 Foo 再一次不知道这组子类。所以这是我的困境。整个项目结构不能改变,因为显然系统比我在这里介绍的要大得多,也复杂得多。但是我的要求还是一样的。Foo 需要能够访问 DoSomething() 的子实现才能正常运行。关于如何解决这个问题的任何想法?如果需要任何澄清以更好地理解问题,请告诉我,我将尝试进一步详细说明。