0

次のように、子クラスと親クラスの両方に ISerializable を実装しました。

class CircuitElement : ISerializable
{
    ...
    protected void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");
        info.AddValue("ID", ID);
    }
}

class Bus : CircuitElement, ISerializable
{
    ...
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");
        ((ISerializable)base).GetObjectData(info,context);
        info.AddValue("Voltage", Voltage);
        info.AddValue("BaseVoltage", BaseVoltage);
        info.AddValue("Location", Location);
    }
}

しかし、子クラスBusでは、エラーが発生していますUse of keyword base is not valid in this context。親クラスにインターフェイスを暗黙的に実装するだけでよいことはわかっていますCircuitElement。変換について心配する必要はありませんが、このシナリオには明示的な実装の方が適切であるという印象を受けました (ここに示す理由と同様の理由で: https://stackoverflow.com/a/143425/996592 )

変換を行う方法はありますか、またはISerializable親クラスにインターフェイスを暗黙的に実装するのに行き詰まっていますか?

4

2 に答える 2

2

個人的には、リンク先の回答に示されている視点に同意しません。明示的なインターフェイスの実装は、まさにあなたが与えた理由から、より問題があります。継承ではうまく機能しません。

明示的に実装されたインターフェイスを再実装する場合、その再実装のコード内からも含めて、同じインターフェイスを再実装する型のオブジェクトでその実装を呼び出す方法はありません。

2 つのオプション:

  • 代わりに、暗黙的なインターフェイスの実装を使用してください。個人的には、通常はこちらの方が簡単です。クラス自体について考えているときに実際には意味をなさないメンバーがインターフェースにある場合にのみ、明示的なインターフェース実装を使用します。

  • 明示的なインターフェイスの実装を引き続き使用しますが、その実装では保護された仮想メソッドを呼び出すだけにしてください。その後、派生クラスでその仮想メソッドをオーバーライドし、基本実装を呼び出すことができます。

于 2012-11-22T07:14:52.267 に答える
1

"base"キーワードを使用して変換する必要はありません。"base"実際には、このコンテキストではキーワードを使用できません。暗黙的な方法でインターフェイス"base.GetObjectData" を実装する場合に"ISerializable"使用する親情報を含めたい場合は、基本メソッドを呼び出すだけで、呼び出し元インスタンスの所有者で親メソッドを呼び出す必要があります。

この動作は、オブジェクト指向モデルの単純なものの 1 つであり、変更することはできません。一方、"virtual"キーワードを使用して親メソッドをオーバーライドすることもできます (この場合、このメソッドは必要ないと思います)。

インターフェースの実装方法についていくつかの優れた回答があります

また、ポリモーフィズムに関する完全なマニュアルがMSDN hereにあります。変換できない理由を理解するのに役立ち"base"、他の指定された方法で変換するためのテクニックを見つけることができます。

私の考え:

"dynamic"キーワード andを使用"ExpandoObject"することは、動的モデルを作成し、その上でシリアル化を行うためのより良いアイデアです。私の個人的な意見では、多くの場合、はるかに高速であり、実装も非常に簡単です。

それが役立つことを願っています。

于 2012-11-22T07:24:02.037 に答える