序文を変えます。このコードは、サーバーがSMessageを使用してクライアントへの/からのメッセージを送信し、受信したWindowsデスクトップアプリケーション、クライアント/サーバアプリケーション、ベースクラスは、インタフェースブレーク既存のクライアントに
内で使用されて、私は次のようしていますインタフェース
public interface IMessage
{
string ID { get; }
string R_ID { get; set; }
DateTime Send { get; }
}
ここでは、このインターフェースの具体的な実装である:
[Serializable]
public class SMessage : IMessage
{
public string ID { get; set; }
public string R_ID { get; set; }
public DateTime Send{ get; set;}
public SMessage()
{
R_ID = "";
ID = Guid.NewGuid().ToString();
Send = DateTime.UtcNow;
}
public SMessage(SMessage msg)
{
ID = msg.ID;
Send = msg.UTCSend;
R_ID = msg.R_ID;
}
}
私が使用して世界にソフトウェアをリリースしていますインターフェイス上で、今、私は「」
public interface IMessage
{
string ID { get; }
string R_ID { get; set; }
DateTime Send { get; }
string Where { get; }
}
私の質問、このインタフェースへの追加データの一部を追加する必要があります。フィールドにデータブレーク既存顧客のこの部分を追加しますか?
もしそうなら、既存のクライアントが壊れないようにインターフェイス/コンクリートクラスをどのように更新できますか?
おかげ
は追加情報:
SMessageは、アプリケーション内で送信されている他のメッセージの基本クラスです:
public class InstallMessage : SMessage
{
}
public class ChangeState : SMessage
{
}
にはどうすれば既存のクライアントを壊すから保つことができますか?
私はこれを行うのであれば、:
public interface IMessage2 : IMessage
{
string Where { get; }
}
そして、この:
public class SMessage : IMessage2
{
// the correct implementation for IMessage2 is added and omitted here for brevity
}
をそれでは、私はについて不明だと、私はメッセージならば、私は知らないケースを扱う行う方法ですIMessage2のものかどうか(注:このコードは、クライアントとサーバーのアプリケーションである)]フィールド
既存のコード:NEXTバージョンで送信されます
public void ReceiveChange(ChangeState msg)
{
string x = msg.ID.ToString();
}
NEW CODE:
public void ReceiveChange(ChangeState msg)
{
string x = msg.ID.ToString();
// do I need to do some converting to keep from breaking ?
IMessage2 iMsg = msg as IMessage2;
if(iMsg2 != null)
{
string y = iMsg2.Where;
}
}
おかげ
私は、派生型の「SMessage」(封印されていない)を作成したクライアントを破ることしかできないと思います。 – itsme86
プログラマーで[versioning interfaces](http://programmers.stackexchange.com/questions/138948/how-do-you-evolve-version-an-interface)を読んでください。 – kayess
あなたの更新のために、あなたはキャストする必要もなく、 'msg'はすでに' .yhere'を公開することができます。 'string y = msg.Where;'は問題ありません。 'ReceiveChange'が' ChangeState'の代わりに 'IMessage'を受け取った場合にのみ、キャストを行う必要があります。 (また、あなたのキャストが間違っていると、例外が発生します。IMessage2 iMsg = msgはIMessage2;としてください。キャストに失敗した場合、 'as'は通常のキャストが実行時例外をスローする場合にnullを返します。 ) –