Java抽象类 - 我怎样才能最好地解决这个问题?

时间:2016-03-01 13:08:10

标签: java inheritance abstract-class

我有一个抽象类'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()抽象并让两个类实现它,但这确实创建了一些重复/非常相似的代码。

6 个答案:

答案 0 :(得分:2)

我会调用一个显式的工厂方法来明确这就是它正在做的事情。

static TcpHandler create(String mode) {
    return mode.equalsIgnoreCase("user") ? new UserHandler() : new MerchantHandler();
}

然后,您可以在实例代码中调用此方法。

答案 1 :(得分:0)

我建议坚持策略设计模式并在TopHandler摘要中声明sendMessage()。然后在UserHandler和MerchantHandler类中实现该方法。

原因是:假设必须扩展此代码,那么可以简单地添加另一个扩展TopHandler的类并实现所有继承的方法并测试新类。如果必须更改原始的TopHandler类,那么该类也必须进行测试。

在每个子类中实现此方法时,可读性也更好。

答案 2 :(得分:0)

你应该使sendMessage()抽象并在两个类中实现它们。并尝试将重复的代码移动到TopHandler类中的单独方法中。

因为了解父类内的儿童班并不好。父类应该只包含可在每个子类中使用的公共代码。

您可以阅读有关抽象类here

的内容

答案 3 :(得分:0)

由于sendMessage()TopHandler中定义且不是静态的,我假设您调用它时已经有了具体的实现(UserHandlerMerchantHandler实例)打电话给它。

首先,在这种情况下,不要在sendMessage()中再创建任何实例。

sendMessage()保留在TopHandler和非摘要中,并在TopHandler中为sendMessage()中使用的每种特定于实现的方法创建抽象方法。这样,通用实现将保留在TopHandler中,避免代码重复,只有具体内容将在子类中实现。

或者,如果您的意图是sendMessage()是静态的 - 在这种情况下:

  • 将其抽象化不是一种选择
  • 第一部分基本上是工厂模式(为了清晰起见,可以将其分为自己的方法)
  • 实际发送只应进行一次(不是在每个条件的分支中)和使用TopHandler
  • 的(可能是抽象的)方法

答案 4 :(得分:0)

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

如果您创建另一个继承自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而不是新的处理程序(但由于我们没有完整的代码,因此很难说)。

答案 5 :(得分:0)

检查类型的if/else代码的存在会告诉您,您做错了。这就是继承和多态从而消除的原因。

如果Handler子类需要在sendMessage()中执行不同的操作,那么抽象类需要提供合理的默认值或使方法抽象化。

工厂/虚拟构造函数建议现场点亮。