我的情况是
头等舱:
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 {
但这是重复代码,因为在MyPanel
和MyForm
我有两个相同的方法!?
我知道在Java中,不可能从2个类扩展....
我想创建一个从Class
或Form
延伸的抽象通用Panel
,并继承方法findComponent()
。
答案 0 :(得分:2)
为Form
和Panel
编写超类(或界面)。
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)
两种方式:
findComponent()
方法
原型; findComponent()
。这完全取决于你的需求。如果必须只编写一次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。