Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中用更多参数重写方法?_Java_Oop_Overriding_Overloading - Fatal编程技术网

在java中用更多参数重写方法?

在java中用更多参数重写方法?,java,oop,overriding,overloading,Java,Oop,Overriding,Overloading,我有一个基类,其方法名为execute: class A { public execute(int a){} } 我还有一个类B,它扩展了a,但是execute方法需要更多参数: 目前,我的解决方案使用可选参数: class B extends A { public execute(int a, Object... parameters){ long b = (long)parameters[0]; boolean c = (boolean)pa

我有一个基类,其方法名为
execute

class A {
    public execute(int a){}
}
我还有一个类B,它扩展了a,但是
execute
方法需要更多参数:

目前,我的解决方案使用可选参数:

class B extends A {
    public execute(int a, Object... parameters){
        long b = (long)parameters[0];
        boolean c = (boolean)parameters[1];
        ....
    }
}

这仍然很难看,因为我必须对参数进行强制转换。对于这种情况,还有其他选项吗?

您可以在b中添加一个
execute(inta,intb)
,但它不会覆盖
execute(inta)
方法,它会使其过载。这两个方法都可以在
B

的实例上调用,这将打破OO范式。实线中的L表示Liskov替换原理

例如,应用于您的原则是B应表现为A

更好的解决方案是通过构造函数注入这些参数,并在没有任何参数的情况下执行

class A {
    int a;
    public A(int a){
        this.a = a;
    }
    public execute(){ // do something with a}
}

class B {
   int a;
   long b;
   boolean c;

    public B (int a, long b, boolean c) {
        this.a = a;
        this.b = b; 
        this.c = c;
    }

    public execute(){ // do something with a, b and c}

}

是否需要为
execute()
指定固定数量的参数?请参阅Vitalii Fedorenko的文章,其中列出了所有可能的选项。@Atri:我不需要固定数量的参数,我想按基类调用。例如:A A=MyFactory.getInstance(…),A.execute(…)是的,如果我使用B的实例是可以的,但在我的例子中,我使用基类(A)的实例。但是当B需要比A更多的参数时,如何注入参数?A和B会有自己的构造函数,正好有他们需要的参数。是的,但在我的例子中,我使用一个工厂来创建基类a的实例。你能发布更多的代码吗,我不确定我是否在遵循?