假设我们有这个界面:
public interface ILog
{
void Add(Message message);
}
当然也应该有一些方法来访问这些添加的消息。但你认为更自然和正确的是什么? ILog实现IEnumerable属性?或者两者都有?或者两者都有点奇怪和不必要?或者它应该是IEnumerator而不是IEnumerable? (或者那可能是完全错误的?还没有完全理解那些......之间的区别......)
public interface ILog : IEnumerable<Message>
{
void Add(Message message);
}
public interface ILog
{
IEnumerable<Message> Messages { get; }
void Add(Message message);
}
public interface ILog : IEnumerable<Message>
{
IEnumerable<Message> Messages { get; }
void Add(Message message);
}
这当然可能有点主观,但我想听听别人的意见。我真的不知道,也没有其他人问:p
答案 0 :(得分:3)
我建议ILog
根本不应该有一个枚举器 - 执行日志记录的代码不需要枚举所有消息。
关键是一个类可以实现多个接口 - 因此您可以(并且应该)将每个接口都集中在特定用途上。
所以,我创建了第二个接口(比如ILogStore
)来实现消息的枚举器:
public interface ILogStore
{
IEnumerable<LogMessage> GetMessages();
}
我将其作为成员函数以允许将来可能的重载。比如说,您希望从特定子系统获取所有日志消息:
public interface ILogStore
{
IEnumerable<LogMessage> GetMessages();
IEnumerable<LogMessage> GetMessagesBySubsystem(string subsystem);
}
等等。
答案 1 :(得分:2)
使用.NET Framework方式,您应该定义一个继承自Collection {T}的集合类(“MessageCollection”)。这提供了添加或删除消息的功能,并实现了接口IEnumerable {T}。
您的界面应该定义一个只读属性“Message”,它返回您定义的集合类的实例。
public interface ILog {
MessageCollection Messages {get;}
void AddMessage(Message message); // Additional method.
}
public class MessageCollection : Collection<Message>{
// Addional methods.
}
答案 2 :(得分:1)
直觉:让它成为会员。
如果界面只包含AddMessage和messgae枚举,则可以继承。但是,在这种情况下,ILog
本身的作用是值得怀疑的。
首先,消息生成实际上总是与消息消费分开。所以我将ILog
拆分为ILogTarget
(包含AddMessage)和ILogMessages
,提供消息枚举。
(这种分离可能是人为的,也可能是应用程序的顶层,所以请将其作为一般性评论。)
即使在这种情况下,我也会IEnumerable Messages
成为ILogMessages
的成员,因为该界面可能会增长:您可以添加IEnumerable Errors
或单独的过滤选项。
作为一个小问题,通过智能感知更容易发现成员。
答案 3 :(得分:0)
IMO,您只需从IEnumerable&lt; Message&gt;继承您的接口,因此您不需要特殊属性来获取消息,因为IEnumerable具有相应的方法GetEnumerator。 这对.net框架来说是最优雅和自然的。