2013-03-07 63 views
0

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

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

好吧,在方法,所以你有共性:

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也与另一组类共享类似的功能,那么您可能需要重新考虑您的类结构。

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

} 

这里要添加一个钩子允许子类停止,如果他们的愿望。显然你可以扩展它来包含任何其他可选功能。

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

模板的方法是有用的,当你有一个应该为所有子类共享的步骤。

Template Method Wiki

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

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

0

一般情况下,和尽可能多的,我喜欢把常用功能在外部(静态)方法,主要有两个原因(他们是非常轻微的不同,相关的):

  1. 我宁愿避免为了保留我的“继承槽”,我可以只继承一个类,并且我希望在扩展时贪婪,在非常必要时或在适当的情况下使用它(见第2点);

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