我有很多孩子去基地,并计划增加更多。我很懒。子创建者设置超级构造函数所需的一些基本内容,反之亦然。我的问题的一个简单解决方案如下:
array = %w(id address work)
array.each do |a|
define_method "#{a}_attachment_require_upload?" do
!object.public_send("#{a}_attachment?")
end
end
然而,在每个孩子身上调用super.finalSetup()都是非常麻烦的事情,如果我忘记它就会破坏它。那不好。我的问题很简单:有没有办法将其设置为父级。至于我的谷歌技能,我一直无法找到。希望你们知道我不知道的事情。
由于
答案 0 :(得分:0)
这应该这样做。基本思想是覆盖子节点中的before和after方法,在父构造函数中,您只需运行它们并在其间进行一些初始化。当然,这并不能避免忘记调用父构造函数。
abstract class Parent {
Parent(){
doBefore();
// some stuff
doAfter();
}
abstract void doBefore();
abstract void doAfter();
}
class Child extends Parent {
Child(){
super();
}
void doBefore(){
// do before stuff
}
void doAfter(){
// do after stuff
}
}
在父级中使用abstract
方法,您可以实现前/后过程的任何排列。
答案 1 :(得分:0)
这应该是你想要的,但正如已经提到的,它可以是not the best idea。如果超类中有无参数构造函数,则不需要在子类中显式调用父构造函数。
abstract class Parent {
Parent() {
/*some code*/
childInit();
finalSetup();
}
void finalSetup() {/*code that dependent on the fact that the child constructor has run*/}
abstract void childInit();
}
class Child extends Parent {
@Override
void childInit() {
/* the code you would put in child's constructor */
}
}
答案 2 :(得分:0)
考虑工厂模式来创建扩展Parent的泛型类型。
public class Parent {
public Parent(){/*some code*/}
public void finalSetup(){/*code that dependent on the fact that the child constructor has run*/}
public static <T extends Parent> T makeChild(Class <T> klass) {
T child = null;
try {
child = klass.newInstance();
child.finalSetup();
}
catch (InstantiationException| IllegalAccessException ex) {
// somthing went wrong
}
return child;
}
}
并致电
Child child = Parent.makeChild(Child.class);
在以下情况下很有用:
+一个类无法预测它必须创建的对象类
+一个类希望其子类指定字段或它创建的对象
+ classes将责任委托给几个辅助子类之一,并且您希望本地化哪个辅助子类是委托的知识