我有一个抽象类“ TopHandler”。有两个扩展TopHandler的类:'UserHandler'和'MerchantHandler'。

我有一个sendMessage()方法,我不确定在哪里放置。一种选择是将其放入TopHandler并创建UserHandler或MerchantHandler的对象,如下所示:

public abstract class TopHandler {

    //Other methods...

    public void sendMessage() {

        TopHandler handler;
        if (message.equalsIgnoreCase("User")) {
            handler = new UserHandler();
            //Call UserHandler implementation of abstract methods
        } else {
            handler = new MerchantHandler();
            //Call MerchantHandler implementation of abstract methods
        }
    }
}


我的另一个选择是使sendMessage()抽象化,并让两个类都实现它,但这确实会创建一些重复/非常相似的代码。

最佳答案

我个人的观点是,一个类不应该知道其子类。

如果您创建另一个从TopHandler继承的类,将会发生什么?
您将需要更改TopHandler类的行为,而不是简单地覆盖子类中的方法。

您可以找到其他意见here on programmers stackexchange

要回答您的问题,解决方案很简单:在每个子类中覆盖方法。如果存在重复,请尝试重构您的类以将其大部分移到TopHandler类中。

可能是这样的:

public abstract class TopHandler {

    //Other methods...

    public void sendMessage() {
        TopHandler handler = createHandler();
        //Call Handler implementation of abstract methods
    }

    public abstract TopHandler createHandler();
}


PS:作为一种非静态方法,sendMessage实例化一个新的TopHandler感觉很奇怪。您这里可能有问题。也许您只需要使用this而不是新的处理程序即可(但是很难说,因为我们没有完整的代码)。

07-24 12:41