我有两个班级
public class ABC {
public void test() {
Car a = new Car();
a.start();
}
}
public class DEF {
public void test() {
Car a = new Car();
a.start();
a.stop();
}
}
现在这两个类几乎都做同样的事情,如何提取出共性,或者什么是最好的方法..模板方法是否可行..我在哪里使用接口...并且有一个父方法调用在子类上实现的抽象方法?...但这意味着一个类在方法中没有操作?
答案 0 :(得分:1)
是的,你可以在这里使用模板方法模式:
public abstract class Template {
public void test() {
Car a = new Car();
a.start();
if(shouldStop()) {
a.stop();
}
}
public abstract boolean shouldStop();
}
public class ABC extends Template {
public boolean shouldStop() {
return false;
}
}
public class DEF extends Template {
public boolean shouldStop() {
return true;
}
}
在这里,您要添加一个钩子,以便子类可以根据需要停止。显然,您可以将其扩展为包含任何其他可选功能。
答案 1 :(得分:0)
好的,所以你在这些方法中有共同之处:
Car a = new Car();
a.start();
你可以做的是制作一个抽象类,这两个类extend
。
public abstract class ParentClass
{
public void test()
{
Car a = new Car();
a.start();
}
}
然后,从您的子类中,您可以调用:super.test();
。这将在返回当前方法并完成子类实现之前调用父类中的方法。
此方法的优点
现在可以拉出这些类中的所有常用代码,并放在ParentClass
内。这意味着不重复代码,这总是好的。它还意味着您的类具有逻辑结构,只要超类正常运行。这再次被认为是一种很好的做法,因为它使您的代码在语义上更具逻辑性。
此方法的缺点
ParentClass
是其他类extend
的唯一类。这称为Inheritance,多个继承是Java不支持的,所以请记住这一点。如果您的ABC
也与另一组类共享了类似的功能,那么您可能需要重新考虑您的类结构。
答案 2 :(得分:0)
除了这个微不足道的例子之外,我有点依赖于你还有什么,但你可以这样做:
public class ABC {
public Car test() {
Car a = new Car();
a.start();
return a;
}
}
public class DEF extends ABC {
public Car test() {
Car a = super.test();
a.stop();
}
}
答案 3 :(得分:0)
当您拥有应为所有子类共享的步骤时,模板方法很有用。
基本结构就是你已经说过的。一个抽象类,包含一些必须由子类实现的抽象方法。
另一方面,接口定义了API,而不是行为。所以在这种情况下它没用。
答案 4 :(得分:0)
一般而言,我更喜欢在外部(和静态)方法中加入常用功能,主要有两个原因(它们略有不同且相关):
我更愿意避免保留我的“继承槽”,我可以只从一个类继承而且我想在扩展时贪婪,在非常必要时或在适当的情况下使用它(见第2点); < / p>
只有在类之间存在“类型”关系的情况下才应使用继承;无论如何,我个人认为在Java中你可能会被强迫以错误的方式使用继承,因为Java语言不提供共享常用功能的机制(例如ruby中的模块)。