C#:ILog接口应该是IEnumerable <message>吗?</message>

时间:2009-06-25 09:12:47

标签: c# interface

假设我们有这个界面:

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

4 个答案:

答案 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框架来说是最优雅和自然的。