Java 抽象类从实现子类获取参数?
我想知道是否有办法在不破坏封装的情况下做到这一点,我希望抽象类依赖于实现子类中定义的参数。像这样:Java 抽象类从实现子类获取参数?,java,Java,我想知道是否有办法在不破坏封装的情况下做到这一点,我希望抽象类依赖于实现子类中定义的参数。像这样: public abstract class Parent { private int size; private List<String> someList; public Parent() { size = getSize(); someList = new ArrayList<String>(size);
public abstract class Parent {
private int size;
private List<String> someList;
public Parent() {
size = getSize();
someList = new ArrayList<String>(size);
}
public abstract int getSize();
}
public class Child extends Parent {
@Override
public int getSize() {
return 5;
}
}
公共抽象类父类{
私有整数大小;
私人名单;
公共家长(){
size=getSize();
someList=新的ArrayList(大小);
}
公共抽象int getSize();
}
公共类子级扩展父级{
@凌驾
公共int getSize(){
返回5;
}
}
这难看吗?有更好的办法吗?也许更重要的是,这是个好主意吗
编辑:
这些类是在框架的上下文中创建的,因此默认的无参数构造函数总是被调用的(实际上,父类扩展了另一个类)。size参数仅用于说明目的,我不打算将其用于列表实现。如果构造函数是您使用的唯一位置
getSize()
,只需将其作为构造函数参数即可
但更重要的是,你为什么关心尺寸?除非您知道有问题,否则只需像其他人一样使用默认大小:
public abstract class Parent {
private List<String> someList = new ArrayList<String>();
// use default constructor
}
公共抽象类父类{
private List someList=new ArrayList();
//使用默认构造函数
}
不,它并不难看。此模式名为“模板方法”。但通常,当方法不是简单的getter而是实现业务逻辑的东西时,它更有用
在您的情况下,另一种解决方案是在父类中定义受保护的构造函数,并使用子类中的相关参数调用它:
public abstract class Parent {
private int size;
private List<String> someList;
protected Parent(int size) {
this.size = size;
someList = new ArrayList<String>(size);
}
public int getSize() {
return size;
}
}
public class Child extends Parent {
public Child() {
super(5);
}
}
公共抽象类父类{
私有整数大小;
私人名单;
受保护的父级(整数大小){
这个。大小=大小;
someList=新的ArrayList(大小);
}
公共int getSize(){
返回大小;
}
}
公共类子级扩展父级{
公共儿童(){
超级(5);
}
}
模式并不难看,除非您尝试在构造函数中使用它。它允许您以意外结果的方式修改子对象
public class Child extends Parent {
private int mySize = 5;
@Override
public int getSize() {
// The -1 is only to help clarify what happens
return mySize - 1;
}
}
如果您现在创建一个Child实例,它实际上会抛出一个异常,因为不允许负容量。您应该认识到,类的属性只有在父构造函数完成后才初始化。(如果属性是使用父构造函数设置的,并且在Child中定义了一个默认值,那么它将很高兴地覆盖您刚才在Parent()中设置的值)对不起,我应该进一步澄清,这些类是在框架的上下文中创建的,因此默认的无参数构造函数总是被调用的。size参数仅用于说明目的,我不打算将其用于列表实现。嗨,AlexR,谢谢你的回答,但这种方法有一些含义,我没有足够快地提到,我已将它们编辑到我的问题中。很抱歉