我有等级制度。
public interface IIncomingMessage : IMessage
{
String Source { get; set; }
void ProcessMessage();
}
public interface IOutgoingMessages : IMessage
{
void SendMessage();
}我有一个客户端,它使用静态CreateMessage方法来生成我的消息。
IMessage message = MessageFactory.CreateMessage("incomingA");
messageA.ProcessMessage();但是,如果我将ProcessMessage()添加到IMessage中,则是唯一能够做到这一点的方法。但是,如果我这样做,那么我必须在IOutgoingMessage中实现这一点。
现在,当我写这篇文章的时候,我看到我可以摆脱IMessage。我应该吗?还是有更好的方法来做这件事?
发布于 2014-05-21 14:27:51
根据您使用CreateMessage工厂的方式,您期望ProcessMessage是所有IMessage类型的通用方法。根据您期望代码工作的方式,我认为IMessage应该定义一个ProcessMessage方法接口。
但是,在查看代码片段时,我认为您的意图并不总是处理消息,而只是在它是IIncomingMessage实现的情况下才这样做。所以你的工厂方法是行不通的。T. Kiley建议有两种工厂方法的CreateInboundMessage和CreateOutboundMessage可能更有意义,因为您对这两种类型的消息都有不同的行为。然后,这些方法将返回IIncomingMessage和'IOutgoingMessage`‘实例,然后您可以处理它们或相应地处理它们。
目前,IMessage正被用作标记接口。如果您看到了这方面的需要--无论它是否是泛型(例如MyCollection<T> where T : IMessage)的约束,那么就保留它。但是,如果它真的没有描述行为或一组公共属性/方法,或者它不被用作有用的标记,那么我不确定它提供了什么好处。
同样,这是基于只看到一点代码。我假设幕后有更多的行为和功能。祝你好运!
发布于 2014-05-21 14:28:40
我将试图通过给出这个场景的另一个例子来简化:
public class Animal
{
void Run();
}
public class Giraffe : Animal
{
void ExtendNeck();
}
public class Monkey : Animal
{
void EatBanana();
}现在,我可以将EatBanana()添加到Animal中了吗?正如您自己注意到的,并不是所有的IMessage实现者都是ProcessMessage(),在本例中也不是所有的动物EatBanana()。完成你想要做的事情的另一种方法是什么?只有当您有要在类之间共享的公共功能时才使用IMessage。如果没有,则不需要整数。有雅GNI在心。如果有共同的功能,您以后可以添加它。如果您想要创建一个IncomingMessage并调用特定于IncomingMessage的方法,那么只需创建一个强类型的IncomingMessage并使用它。您甚至可能不需要静态工厂方法。
发布于 2014-05-21 14:29:05
您可以使用不同的类,它们不继承任何东西,并且完全分离进程。如果这样做,在本例中您将失去使用子类的几个优点。它们之间可能有类似的属性,如果它们都扩展了一个公共类,就可以更容易地引用其中一个和另一个。至于这些子类的方法问题,您只需让父类声明一个公共方法(让我们称之为ProcessMessage() ),只需让每个子类覆盖此类方法的行为。这样,您就不必使用不同的方法,而只需使用两个不同的定义。简单的多态性概念。
https://stackoverflow.com/questions/23785831
复制相似问题