0

昨天在工作中遇到了一个非常有趣的问题。

我有 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() 的子实现才能正常运行。关于如何解决这个问题的任何想法?如果需要任何澄清以更好地理解问题,请告诉我,我将尝试进一步详细说明。

4

1 回答 1

3

不允许有项目的静态循环引用;但是,您可以对实例进行动态循环引用。如果你调用m_Bar.DoSomething();然后,由于多态性,正确的实现将被自动调用。If m_Baris a BarthenBar的实现将被调用。If m_Baris a AthenA的实现将被调用。既不需要Bar也不Foo需要A通过E.


更新:(见下面的评论)

public class A : Bar
{
     public override void DoSomething()
     {
         Console.WriteLine("I am an 'A'");
     }
}
于 2012-10-31T17:00:33.300 回答