[英]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 {
但这是重复的代码,因为在MyPanel
和MyForm
我有两个相同的方法!?
我知道在Java中,不可能从2个类扩展....
我想创建一个从Form
或Panel
扩展的抽象泛型Class
,并继承一个方法findComponent()
。
为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
成为一个界面(但这取决于你使用它的方式)。
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 {}
等等
两种方式:
findComponent()
方法原型; 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.