IMsg
この種の構造により、消費者との契約の一貫性を保ちながら、柔軟性が向上する可能性があります。
// the following three MsgId contracts don't have to be contracts at all (the actual types can be specified in generic IMsg directly), but if one ID type is wildly different in nature than the other, an interface such as this might make sense.
public interface IMsgId
{
// ?
}
public interface INewMsgId : IMsgId
{
}
public interface ILegacyMsgId : IMsgId
{
}
public interface IMsg<out TId>
where TId : IMsgId
{
TId MessageId { get; }
byte[] MsgBytes { get; }
}
// if it is sensible, you can use the following interfaces to create definitive new and legacy message contracts
public interface INewMsg : IMsg<INewMsgId>
{
}
public interface ILegacyMsg : IMsg<ILegacyMsgId>
{
}
実装例は次のとおりです。
public class LegacyMsgId : ILegacyMsgId
{
public LegacyMsgId(int id)
{
Id = id;
}
public int Id { get; private set; }
public override string ToString()
{
return "Legacy Message #" + Id;
}
}
public class NewMsgId : INewMsgId
{
public NewMsgId(int id)
{
Id = id;
}
public int Id { get; private set; }
public override string ToString()
{
return "New Message #" + Id;
}
}
public class NewMsg : INewMsg
{
public NewMsg(int id)
{
MessageId = new NewMsgId(id);
}
public NewMsgId MessageId { get; private set; }
INewMsgId IMsg<INewMsgId>.MessageId { get { return MessageId; } }
public byte[] MsgBytes { get; private set; }
}
public class LegacyMsg : ILegacyMsg
{
public LegacyMsg(int id)
{
MessageId = new LegacyMsgId(id);
}
public LegacyMsgId MessageId { get; private set; }
ILegacyMsgId IMsg<ILegacyMsgId>.MessageId { get { return MessageId; } }
public byte[] MsgBytes { get; private set; }
}
そして使用法:
var messages = new List<IMsg<IMsgId>>();
messages.Add(new NewMsg(20));
messages.Add(new LegacyMsg(11));
foreach(var message in messages)
{
Console.WriteLine(message.MessageId);
}