1

让我们想象一下:

// assembly 01

abstract class Foo
{
    abstract void Bar();
}
class AdvancedFoo : Foo
{
    override void Bar() { base.Foo(); ... }
}
sealed class SuperiorFoo : AdvancedFoo
{
    override sealed void Bar() { base.Foo(); }
}

然后我想从我的02 asm 引用该程序集01并替换中间基类(并且只有它),因此 a 的实例就像它们从程序集02继承一样。SuperiorFooAdvancedFoo

// assembly 02

class AdvancedFoo : Foo
{
    override void Bar() { base.Foo(); ... }
}

如果02SuperiorFoo程序集不重写类声明,有什么方法可以做到这一点?

var supFoo = new SuperiorFoo();
supFoo.Bar(); // This one should call assembly 02's Bar();
4

2 回答 2

2

不是以你不做的方式,但你可以使用组合而不是继承来解决你的问题:

interface IFoo
{
    abstract void Bar();
}
class AdvancedFoo : IFoo
{
    override void Bar() { base.Foo(); ... }
}
sealed class SuperiorFoo : IFoo
{
    private IFoo _fooImplementer;

    public SuperiorFoo()
    {
        _fooImplemnter = new AbstractFoo();
    }

    public SuperiorFoo(IFoo fooImplementer)
    {
       _fooImplementer = fooImplementer;
    }

    void Bar() { _fooImplementer.Foo(); }
}

要从您的第二个程序集调用,您将使用第二个构造函数,并传递您的新“advancedfoo”类的一个实例。

于 2012-05-22T08:02:56.653 回答
1

类型转发可以提供帮助:Common Language Runtime 中的类型转发

于 2012-05-22T08:10:02.157 回答