接口继承接口
本文关键字:接口 继承 | 更新日期: 2023-09-27 18:04:21
我有一个层次结构。
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..我应该吗?还是有更好的方法?
根据您使用CreateMessage
工厂的方式,您期望ProcessMessage
是所有IMessage
类型的通用方法。根据您期望的代码工作方式,我认为IMessage
应该定义一个ProcessMessage
方法接口。
然而,在查看代码的小片段,在我看来,你的意图是不总是处理消息,但只有这样做,如果它是一个IIncomingMessage
实现。所以你的工厂方法是行不通的。T. Kiley关于CreateInboundMessage
和CreateOutboundMessage
两个工厂方法的建议可能更有意义,因为您对这两种类型的消息有不同的行为。然后这些方法将返回IIncomingMessage
和'IOutgoingMessage '实例,然后您可以处理它们或相应地处理它们。
IMessage
目前被用作标记接口。如果你认为有必要这样做——无论是对泛型的约束(例如MyCollection<T> where T : IMessage
),那就保留它。但如果它真的不描述行为或一组常见的属性/方法,或者如果它不被用作有用的标记,那么我不确定它提供了什么好处。
同样,这是基于看到的一小部分代码。我猜想在幕后有更多的行为和功能。祝你好运! !
我将尝试通过给出该场景的另一个示例来简化:
public class Animal
{
void Run();
}
public class Giraffe : Animal
{
void ExtendNeck();
}
public class Monkey : Animal
{
void EatBanana();
}
现在是可以的,如果我现在添加EatBanana()
到Animal
?正如您自己注意到的,并非所有IMessage
实现者都是ProcessMessage()
,在本例中也并非所有动物都是EatBanana()
。完成你想做的事情的另一种方法是什么?只有在需要在类之间共享公共功能时才使用IMessage
。如果没有接口,就不需要接口。考虑YAGNI。如果有常见的功能,您可以稍后添加它。如果您想创建IncomingMessage
并调用IncomingMessage
特定的方法,那么只需创建一个强类型的IncomingMessage
并使用它。您甚至可能不需要静态工厂方法。
你可以使用不同的类,这些类不继承任何东西,完全分离进程。如果这样做,就会失去在这种情况下使用子类的几个优点。它们之间可能有类似的属性,如果它们都扩展了一个公共类,那么它们之间的引用就更容易了。至于这些子类的方法问题,您可以简单地让父类声明一个公共方法(我们称之为ProcessMessage()
),并简单地让每个子类覆盖这种方法的行为。这样就不需要使用不同的方法,只需要两个不同的定义。简单多态性概念
(假设'MessageFactory.CreateMessage("incomingA")'返回类型为IIncomingMessage的对象)
使用var
var message = MessageFactory.CreateMessage("incomingA");
message.ProcessMessage();
或强制转换结果
IMessage message = MessageFactory.CreateMessage("incomingA");
if (!(message is IIncommingMessage))
throw new InvalidOperationException();
(message as IIncommingMessage).ProcessMessage();