继承方法需要一个参数

Alb*_*gni 5 java inheritance overriding

我有一个有几个孩子的家长班.其中一个孩子有一个被覆盖的方法,对于其特定的内部使用,需要一个更多的参数.我不想更改方法的签名,因为其他子节点中的重写方法不需要此参数,我也不想添加类属性,因为在这种情况下它是没有意义的.

你如何处理这些情况?

到目前为止,我已经在方法中添加了一个NotImplementedException并创建了一个新的,但它确实是我在等待答案时所做的事情,我不想这样做.


在Jon Skeet的回答之后编辑

我会试着弄明白我是否理解乔恩的建议.这非常有趣.

public abstract class Parent {
    public abstract void aMethod(Object parameter);
}

public class NotReallyParentChild {
    public Parent createInstance(){
        return new Child();
    }
}

public abstract class Child extends Parent {

}
Run Code Online (Sandbox Code Playgroud)

嗯,不,我在这里完全错了,我不明白你帖子的第二部分,请问你能否对此有所了解?

Jon*_*eet 10

听起来你并没有真正的继承关系 - 它打破了Liskov的Subtitutability Principle,因为你不能使用这个"child"就好像它是父类的一个实例,没有额外的知识.

如何使"子"类不是从"父"派生的,而是在子上提供一个方法,它将创建父类的某个子类的实例,它"知道"适当的额外信息位?如果您可以向我们提供有关类正在执行的操作的更多信息,我们可以提供更具体的示例,说明代码的外观.

编辑:如果不了解更多关于你正在做什么的事情,很难让这个更加清晰,但是类似于:

public class NotReallyParentChild {
    public Parent createInstance(Object extraParameter){
        return new ChildWithParameter(extraParameter);
    }
}
Run Code Online (Sandbox Code Playgroud)

ChildWithParameter则类可以覆盖相应的方法,而不采取任何额外的信息,因为它已经有了它自己的内部状态的一部分.

  • +1 - 如果它需要一个额外的参数,它不会覆盖相同的方法**. (3认同)

Bri*_*new 5

虽然同意Jon认为继承模型被破坏的观点,但您可以通过使用特殊参数对象处理这样的场景.也就是说,而不是有一个方法:

void myMethod(Object param1, Object param2, Object param3...);
Run Code Online (Sandbox Code Playgroud)

你有一个ParameterObject包含所需参数的对象,你的方法如下:

void myMethod(ParameterObject param);
Run Code Online (Sandbox Code Playgroud)

这样,您可以向参数对象添加参数,而不会影响或更改接口和实现的方法.

如果我写的方法和参数的数量似乎过多,并且我相信我的封装不以任何方式损坏(这种情况经常发生在财务软件时,方程/模型需要大量的投入),然后我发现上面一个非常有用的模式.