我什么时候应该声明抽象方法?

When should I declare abstract methods?

我目前正在开发一个应用程序,它通过不同的网络与系统中的其他应用程序进行通信。目前通过DIS as well as RabbitMQ进行通讯。然而,在内部,应用程序不关心消息是谁发送的或以什么格式发送的。

考虑到这一点,我制作了一个摘要 class,其中包含名为 InternalMessage 的信息,以及一个用于发送和接收这些消息的摘要 class,OrchestrationMessenger。该应用程序轮询 Messengers 以获取传入消息并发回响应。但是,向网络发送消息的过程发生在 class 内部,并且依赖于扩展 InternalMessage.

的具体 class

我知道每个 Concrete class 需要的函数是否应该在 Abstract class 中声明?我了解如何声明这些方法,我只是不知道我是否应该

例如:将传入消息转换为我的内部格式的函数,反之亦然,从网络读取传入消息,并发送传出消息。

抽象信使:

//Package omitted
import java.util.Queue;

//Comments omitted
public abstract class OrchestrationMessenger <M extends InternalMessage> implements Runnable
{
    protected Queue<M> incoming, outgoing;

    //Send out a Message, such as responses or commands
    public void publish(M message)
    {
        outgoing.add(message);
    }

    //Receive next incoming Message Object
    public M process()
    {
        return incoming.poll();
    }

    //Check if there are any Messages to process
    public boolean hasNext()
    {
        return !incoming.isEmpty();
    }
}

谢谢!

是否只在内部使用方法并不重要,决定是否将它们声明为抽象的。

如果您的抽象 class 的每个子 class 都需要此方法,并且每个都有其特定的实现(因此需要在具体的子 classes 中实现),那么将它们作为抽象方法添加到您的抽象 class 中可能是个好主意。

通过这种方式,您可以确定,您所有的实现都有这些方法,可以帮助您获得更清晰的 class 模型和更少的冗余(如果不是现在,那么将来肯定会)。

Should the functions that I know each Concrete class will need, but that will only be used internally, be declared in the Abstract class ?

要回答这个问题,您必须考虑是否只有具体的子 classes 才需要此方法。

例如,您有 class Person 并且 Person 的每个子 class 需要一个通用方法,即 calculateWeight 其中 returns的权重Person。你必须说每个 Person 都会有相同的方法来做到这一点。然而,其他 ObjectAnimal 也需要相同的方法来计算动物的重量。请注意,该方法的要求不仅限于 sub classes。那么就不应该在abstactclass。它应该是实用方法,否则在 abstract parent 中有共同的实现就可以了。