我有一个抽象类'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()抽象并让两个类实现它,但这确实创建了一些重复/非常相似的代码。
答案 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
中定义且不是静态的,我假设您调用它时已经有了具体的实现(UserHandler
或MerchantHandler
实例)打电话给它。
首先,在这种情况下,不要在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()
中执行不同的操作,那么抽象类需要提供合理的默认值或使方法抽象化。
工厂/虚拟构造函数建议现场点亮。