19

C#のような優れた複数継承の切断された言語で「MarshalByRefObjectでなければならない」を解決する方法は?

問題は非常に単純です。場合によっては、このクラスから継承する必要があります (インフラストラクチャ要件)。ここでは、どちらの場合でも問題ありません。では、他のクラス (ドメイン モデルの要件) から既に継承している場合はどうすればよいでしょうか。

ところで、spring.net のような優れたアプリケーション フレームワークでは、クラスに適用する必要があるインフラストラクチャの種類に関係なく、このクラスから継承する必要はありません。

ここで-3票を獲得しているのは何ですか?? :)

4

5 に答える 5

18

一般に、オブジェクトを Remoting / WCF コンテキストで使用する場合にのみ MarshalByRef を作成する必要があります。これは通常、特別なケースであり、苦痛ではありません。

一般的な型があり、それから派生させて特殊化し、派生型をリモート化するとします。リモート化するには、オブジェクトが MarshalByRefObject から継承する必要があり、元の一般的な型が継承されていないため、問題が発生します。 . バイナリ継承を行っているため、または変更できない基本クラスから派生しているため、変更できないとしますか? 質問者が指摘するように、C# (および .NET 全般) では MI が許可されていないため、両方から継承することはできません。

簡単に言えば、あなたは一種のめちゃくちゃだということです。一般的な型を MarshalByRefObject から継承するように変更する (または、効果的な場所に挿入できるようにチェーンを十分に遡る) か、プロキシ オブジェクトをいじることを考えることができます。

たとえば、型のインターフェイスを記述するインターフェイス コントラクトを作成し、MarshalByRefObject から継承するプロキシ型を構築します。このプロキシ型は、合成と型のインスタンス (つまりラッパー) への委譲によってそのインターフェイスも実装します。次に、そのプロキシ型のインスタンスをリモートで作成して、型をインスタンス化し、期待どおりに動作させることができますが、メソッドからのすべての戻り型は [Serializable] である必要があります。

public interface IMyType
{
    string SayHello();
    string BaseTypeMethodIWantToUse();
}

public class MyType : MyBaseType, IMyType
{
    public string SayHello()
    {
        return "Hello!";
    }
}

public class MyRemoteableType : MarshalByRefObject, IMyType
{
    private MyType _instance = new MyType();

    public string SayHello()
    {
        return _instance.SayHello();
    }

    public string BaseTypeMethodIWantToUse()
    {
        return _instance.BaseTypeMethodIWantToUse();
    }
}

しかし、多くの仕事のように見えます。最終的に、このシナリオにいる場合は、再設計または再考することをお勧めします.

于 2008-11-24T02:11:09.837 に答える
1

それは、どのように取得する必要があるかによって異なります。MarshalByRefObject から派生した基本クラスを使用すると、それが可能になる場合があります。集約はそれを行うかもしれません。必要なもののより具体的な例がなければ、言うのは難しいですが、多重継承が問題の唯一の解決策になることはめったにありません。

于 2008-11-24T02:10:46.593 に答える
1

複数のクラスから継承することはできません。そのため、(a) 継承階層を変更してベースが継承されるようにするか、(b) アプリケーションを別の方法で作成する必要があります。

継承する必要がある理由、または基本クラスが継承しない (できない?)理由に関する詳細情報がなければ、これ以上具体的なアドバイスを与えることは困難です。MarshalByRefObject

しかし、ベースとは異なるマーシャリング セマンティクスを必要とする派生型がある場合は、おそらくアーキテクチャ上の問題がどこかにあると思います。

于 2008-11-24T02:12:00.223 に答える
0

「では、他のクラス (ドメイン モデルの要件) から既に継承している場合はどうしますか?」

MarshalByRefObject からの継承を必要とするドメイン モデルの一部の基本クラスを作成できますか?

于 2008-11-24T02:44:20.613 に答える