-1

我有两节课

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

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

4

5 回答 5

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

}

在这里,您要添加一个钩子以允许子类在需要时停止。您显然可以扩展它以包含任何其他可选功能。

于 2013-03-07T17:19:38.017 回答
0

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

模板方法维基

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

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

于 2013-03-07T17:24:08.253 回答
0

通常,并且尽可能地,我更喜欢将通用功能放在外部(和静态)方法中,主要有两个原因(它们非常细微的不同和相关):

  1. 我更喜欢避免保留我的“继承槽”,我可以只从一个类继承,并且我希望在非常必要或适当的情况下使用它(见第 2 点);

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

于 2013-03-07T17:43:31.313 回答
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。这称为继承,Java 不支持多重继承,因此请记住这一点。如果您ABC还与另一组类共享类似的功能,那么您可能需要重新考虑您的类结构。

于 2013-03-07T17:18:24.663 回答
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();
    }
}
于 2013-03-07T17:19:54.240 回答