【发布时间】:2016-09-02 15:05:55
【问题描述】:
前言:此代码用于 Windows 桌面应用程序、客户端/服务器应用程序,其中服务器使用基于 SMessage 的类向客户端发送和接收消息
我有如下界面
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;
}
}
我已经使用上面的界面向世界发布了软件,现在我需要在这个界面“Where”中添加一条额外的数据
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 的情况? (注意:此代码在客户端和服务器应用程序中)
现场现有代码:
public void ReceiveChange( ChangeState msg )
{
string x = msg.ID.ToString();
}
将在下一个版本中发布的新代码:
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派生类型的客户端(它不是密封的)。 -
请在programmers.SE阅读versioning interfaces。
-
对于你的更新,你甚至不需要强制转换,
msg已经暴露了.Where你可以直接使用string y = msg.Where;没有问题。如果ReceiveChange接受IMessage而不是ChangeState,您只需要进行演员表。 (另外,你的演员阵容是错误的,你会得到一个例外,你应该这样做IMessage2 iMsg = msg as IMessage2;,如果演员阵容失败,as将返回 null,而普通演员将引发运行时异常) -
非常感谢,但我仍然担心如果我更新服务器并且字段中有旧客户端在消息中没有 IMessage2 接口.. 服务器不会崩溃然后?换句话说,服务器有新的 IMessage2 消息...客户端有 IMessage 消息。客户端使用基于 IMessage 接口的消息调用服务器...服务器如何防止崩溃?