接口继承接口

本文关键字:接口 继承 | 更新日期: 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关于CreateInboundMessageCreateOutboundMessage两个工厂方法的建议可能更有意义,因为您对这两种类型的消息有不同的行为。然后这些方法将返回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();