繁体   English   中英

Java Generic子类与构造函数

[英]Java Generic subclassing with constructor

我的情况是

头等舱:

public class Form{
   public Form(String id){
       super(id); 
   }
  // some methods ...
}

第二类:

public class Panel{
  public Panel(String id){
     super(id);
  }
// some methods...
}

我可以扩展两个类

public class MyForm extends Form {

public class MyPanel extends Panel {

但这是重复的代码,因为在MyPanelMyForm我有两个相同的方法!?

我知道在Java中,不可能从2个类扩展....

我想创建一个从FormPanel扩展的抽象泛型Class ,并继承一个方法findComponent()

FormPanel编写一个超类(或接口)。

public abstract class Item {
   private abstract void duplicateMethod();
}

public class Form extends Item {
   private void duplicateMethod() {

   }
}

public class Panel extends Item {
   private void duplicateMethod() {

   }
}

更好的是,使Item成为一个界面(但这取决于你使用它的方式)。

public abstract class ComponetFinder {
    public ComponetFinder(String id){
        // Do stuff with id
    }
    // some methods...
}

public class Form extends ComponetFinder {
    public Form(String id){
        super(id);
    }
    // some methods...
}

public class Panel extends ComponetFinder {
    public Panel(String id){
        super(id);
    }
    // some methods...
}

然后你可以使用

public class MyPanel extends Panel {}
public class MyForm extends Form {}

等等

两种方式:

  1. 你可以使用一个接口并声明findComponent()方法原型;
  2. 您可以创建一个包含findComponent()的AbstractComponent抽象类。

这取决于你的需求。 如果必须只编写一次findComponent方法,请使用抽象方法。 否则,使用界面。

对于Abstract解决方案:

Form extends AbstractComponent {
   ...
   @Override
   protected void findComponent() {...}


Panel extends AbstractComponent  {
   ...
   @Override
   protected void findComponent() {...}
}

public abstract class AbstractCOmponent {
   protected abstract void findComponent();
}

@Giovanni Botta:是的,当然,总是喜欢Interface。 并且总是喜欢构成而不是继承。 但在这里,如果他不想复制其代码,Abstract会更好。

我建议始终针对接口进行编程。 这是java中最好的习语:

interface ComponentFinder{
  void findComponent();
}

interface Form extends ComponentFinder{}

interface Panel extends ComponentFinder{}

现在您可以让您的类实现接口。 请注意,在java 8中,接口可以使用默认方法 ,从而提供更大的灵活性。

虽然Java不支持多继承,但您可以使用接口执行所需的操作。 (这是lpratlong答案的第1项。)

有关该概念,请参见http://docs.oracle.com/javase/tutorial/java/concepts/interface.html

如果您希望Form和Panel(或MyForm或MyPanel)都实现findComponent() ,首先要有一个接口类。

interface IFormPanel {
   int findComponent();  // your return type is probably not int.
}

然后你会改变你的MyForm和MyPanel声明:

public class MyForm implements IFormPanel {

这将使合同承诺MyForm必须实现findComponent()

现在,如果您希望findComponent返回一个组件,您应该遵循其他一个答案并创建一个抽象超类。 然后它可以返回ComponentFinder(在DirkyJerky的示例中)或Item(在Anubian Noob的示例中)而不是int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM