如何从两个类中提取共性..模板方法?

时间:2013-03-07 17:14:59

标签: java oop

我有两个班级

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();
    }
}

现在这两个类几乎都做同样的事情,如何提取出共性,或者什么是最好的方法..模板方法是否可行..我在哪里使用接口...并且有一个父方法调用在子类上实现的抽象方法?...但这意味着一个类在方法中没有操作?

5 个答案:

答案 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)

当您拥有应为所有子类共享的步骤时,模板方法很有用。

Template Method Wiki

基本结构就是你已经说过的。一个抽象类,包含一些必须由子类实现的抽象方法。

另一方面,接口定义了API,而不是行为。所以在这种情况下它没用。

答案 4 :(得分:0)

一般而言,我更喜欢在外部(和静态)方法中加入常用功能,主要有两个原因(它们略有不同且相关):

  1. 我更愿意避免保留我的“继承槽”,我可以只从一个类继承而且我想在扩展时贪婪,在非常必要时或在适当的情况下使用它(见第2点); < / p>

  2. 只有在类之间存在“类型”关系的情况下才应使用继承;无论如何,我个人认为在Java中你可能会被强迫以错误的方式使用继承,因为Java语言不提供共享常用功能的机制(例如ruby中的模块)。