2011-05-22 46 views
-2

我有程序集A,A有两个类a和b。覆盖引用程序集的类

A.a在其某些方法中使用A.b。

在我的程序集B中,我有两个类B.a和B.b.

B.a继承A.a和B.b继承自A.b.

如何让B.a在使用A.b的方法中使用B.b而不是A.b,而无需访问源代码?

+0

很难回答没有看到任何代码。 A组中的方法中的所有方法都标记为“虚拟”? – 2011-05-22 21:05:18

+0

他们是如何“使用”?他们是参数类型吗?代码中的局部变量? – 2011-05-22 21:06:16

+0

你没有A的来源而不是B吗? – 2011-05-22 21:09:32

回答

1

如果没有A的源代码,并且A不会像使用IoC来解析A.b那样做任何事情,那么您不能。 A.a和A.b之间的依赖关系在编译时设置,并且可能没有简单的方法来截取它。

如果使用A.b的A.a中的方法是虚拟的,那么您可以重写它们,并使用B.b重现其功能。

1

没有A.a的支持?除了对IL(ildasm)进行hackery反编译,更改并重新编译(ilasm)之外,没有其他任何内容。如果组件A具有强名称(有符号),则这将不起作用

0

A中的方法需要标记为virtual以便您可以覆盖它们。

0

嗯,这里有两个问题。

首先,您应该制作A.a中的方法,您打算从A.b中使用(并因此在B.b中“替换”)虚拟。这确保您可以在B.b.中覆盖它们。

然而,无论是机管局访问抗体通过静态方法(它不能被重写),或通过抗体的实例(你不能轻易更换。)

您除了需要做什么如上所述,使方法变为虚拟的方法也是在Aa中提供一个工厂方法,它创建一个Ab实例,然后使用该方法的结果,然后在Ba中覆盖此方法。

让我这个LINQPad程序演示:

void Main() 
{ 
    Ba instance = new Ba(); 
    instance.UseB(); 
} 

public class Aa 
{ 
    public void UseB() 
    { 
     Ab instance = CreateB(); // <-- call factory method instead of new 
     instance.Test(); 
    } 

    public virtual Ab CreateB() 
    { 
     return new Ab(); 
    } 
} 

public class Ab 
{ 
    public virtual void Test() 
    { 
     Debug.WriteLine("A.b.Test"); 
    } 
} 

public class Ba : Aa 
{ 
    public override Ab CreateB() // <-- it still returns type "Ab" 
    { 
     return new Bb();   // <-- just create an instance of Bb instead 
    } 
} 

public class Bb : Ab 
{ 
    public override void Test() 
    { 
     Debug.WriteLine("B.b.Test"); 
    } 
}