Java Generic子类与构造函数

时间:2014-05-16 14:49:13

标签: java class

我的情况是

头等舱:

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个类扩展....

我想创建一个从ClassForm延伸的抽象通用Panel,并继承方法findComponent()

5 个答案:

答案 0 :(得分:2)

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成为一个界面(但这取决于你使用它的目的)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

两种方式:

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

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

    对于抽象解决方案:

    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会更好。

答案 3 :(得分:0)

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

interface ComponentFinder{
  void findComponent();
}

interface Form extends ComponentFinder{}

interface Panel extends ComponentFinder{}

现在您可以让您的类实现接口。请注意,在java 8中,接口可以具有default methods,这提供了更大的灵活性。

答案 4 :(得分:0)

虽然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&#39的例子中)而不是一个int。