我有一堆扩展抽象Base类的类。 每个子类都采用构造函数中的数组(不同长度取决于类)。 这些课程可以由其他人编写。
确定类所需数组长度的最佳方法是什么? 我可以: (A)要求每个派生类都有一个静态方法,返回长度。 但是,基类不能强制执行此操作,因为抽象静态方法在java中不起作用。 (B)每个派生类都有一个没有参数的构造函数,我构造了 这样的类只是为了能够调用countParameters()方法,即 我可以从Base类强制执行。这感觉“笨拙”,因为我对创建这样的对象不感兴趣,但只需要一些关于它的信息。
原因是我正在创建一个GUI,使用户能够创建 派生类的实例,但每个派生类使用不同数量的参数。 也就是说,在创建类之前,我需要知道如何绘制GUI。
编辑: 我可以要求每个Derived类都有一个私有 构造函数,没有参数,并使用反射我可以调用countParameters()方法。
EDIT2:实际上,我感兴趣的是参数的名称是什么。 也就是说,如果Derived类具有构造函数
public Derived(double name1,double name2,...)
我需要一种方法来生成String []数组
{name1,name2,...}
我想如果不创建类的实例,这是不可能的, 但是为了让用户能够创建这样的类,他/她需要参数名称! 片刻22。
答案 0 :(得分:5)
听起来你需要Factory Pattern。
一般来说,基类知道它的后代集是一个坏主意。所以你定义了另一个类,它的工作就是知道它。
如果你有像Shape这样的东西,将ThisShape和ThatShape作为派生类,那么ShapeCreator将处理创建程序支持的特定形状集的工作,为每个人提供所需的参数。
答案 1 :(得分:0)
目前还不太清楚你想要实现什么,但我想知道:子类是否真的必须使用数组的单个参数,而不是参数列表?
Constructor<?> ctor = Test.class.getConstructors()[0];
int parameterCount = ctor.getParameterTypes().length;
ctor.newInstance(new Object[parameterCount]);
答案 2 :(得分:0)
how about this code:
public absract Base {
public abstract int size();
public Base(Object[] objs) {
if (objs.length != size()) {
throw new IllegalArgumentException();
}
//rest of your code.
}
每个子类都需要实现size方法。
希望得到它的帮助。答案 3 :(得分:0)
我会选择方法A.你不能让编译器强制执行这样的方法,但是你当然可以在你的程序中强制执行它 - 没有方法,没有工作!
说真的,整个方案有点脆弱,我想不出一种方法可以让它明显更好。这些子类的错误实现将会爆炸,这就是生命。
可能的补救措施是为这些子类提供一组接口,例如
SubClassTaking2Args
SubClassTaking3Args
...
并要求您的sub实现其中一个作为标记接口。但这只是更多官僚主义,而且影响更小。