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(); }
}

そして、そのアセンブリ0102 asm から参照し、中間基本クラス (およびそれのみ) を置き換えて、 a のインスタンスがアセンブリSuperiorFoo02 から継承しているように動作するようにしますAdvancedFoo

// assembly 02

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

02アセンブリSuperiorFooの場合、クラス宣言を書き直さないことでそれを行う方法はありますか?

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(); }
}

2 番目のアセンブリから呼び出すには、2 番目のコンストラクターを使用して、新しい「advancedfoo」クラスのインスタンスを渡します。

于 2012-05-22T08:02:56.653 に答える
1

型転送が役立ちます:共通言語ランタイムでの型転送

于 2012-05-22T08:10:02.157 に答える