我有一个名为:ComplexValidator的类,它扩展了absract类Validator,它有两个方法:
Validate(Part part);
getAnswer():
我也有验证器,我们将它们命名为A,B,C和D.
所以
AValidator extends Validator
BValidator extends Validator
CValidator extends Validator
DValidator extends Validator
我不在我的代码前面,所以我不会使用伪代码。
CValidator采用与其余部分不同的参数,AB和D使用part来获取文件名等,但CValidator使用numberOfFiles(在loop (for part p: multipart)
中增加,因此在每次循环重复后,numberoffiles会增加,所以我可以比较它与maxNumberOfFiles字段)。
可悲的是,我不知道如何创建抽象类,将任何参数带到方法,所以所有方法必须采用Part部分。 Cvalidator不使用它,我必须使字段numberOfFiles静态,所以我可以访问它。
有没有办法让这些验证器不带参数但不使用静态? 有没有办法让抽象类成为子类能够改变它所采用的参数的方式? 如果它需要其他参数,我可以在以下情况下将其全部循环:
List <Validator> validators = new ArrayList<>();
在我的ComplexValidator中。
然后我将所有子验证器添加到它并循环遍历它们:
for (Validator v: validators){
validate(part);
}
答案 0 :(得分:3)
overriden方法的参数类型必须与原始方法相同。
为了解决您的问题,我将创建一个自定义类,它包含您可能希望传递给validate函数的所有不同参数。
像这样的东西
class Wrapper{
Part param1;
File param2;
File param3;
}
class Validator{
void validate (Wrapper wrapper);
}
class ValidatorA extends Validate{
void validate (Wrapper wrapper){
//use wrapper.part...
}
}
class ValidatorC extends Validate{
void validate (Wrapper wrapper){
//use wrapper.file...
}
}
答案 1 :(得分:1)
您可能想要使用java反射。使用Class
,您可以getMethods
并循环使用每种方法的方法和getParameterTypes
,或者如果事先知道您希望的方法类型getMethod
(没有s)并提供一个类型的数组。
在你的情况下,我将转到第一种方法,并根据第二个参数(文件数)的存在,invoke
方法的好方法(需要所有参数)。