继承方法需要一个参数

时间:2009-10-19 09:53:52

标签: java inheritance override

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

你如何处理这些情况?

到目前为止,我已经在方法中添加了一个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 {

}

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

3 个答案:

答案 0 :(得分:10)

听起来你并没有真正的继承关系 - 它会打破Liskov's Subtitutability Principle,因为你不能使用这个“孩子”,好像它是父母的一个实例,没有额外的知识。

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

编辑:如果不了解更多关于你正在做的事情的话,真的很难让这个更清楚,但是像这样:

public class NotReallyParentChild {
    public Parent createInstance(Object extraParameter){
        return new ChildWithParameter(extraParameter);
    }
}

那个ChildWithParameter类可以覆盖适当的方法,而不用获取任何额外的信息,因为它已经将它作为其内部状态的一部分。

答案 1 :(得分:5)

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

void myMethod(Object param1, Object param2, Object param3...);

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

void myMethod(ParameterObject param);

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

如果我正在编写方法并且参数数量似乎过多,我相信我的封装不会以任何方式破坏(当方程式/模型采用时,这在财务软件中会发生很多很多输入),然后我发现上面的一个非常有用的模式。

答案 2 :(得分:0)

您甚至可以使用泛型来进一步扩展ParameterObject(由Brian Agnew提议)的概念。

public interface Algorithm<P extends AlgorithmParameter> {
    public void doSomething(P parameters);
}

这样,您的CoolAlgorithm需要CoolAlgorithmParameterNiceAlgorithm需要NiceAlgorithmParameter,所以您不必担心参数对象实际上是您想要的 - 仿制药将会解决这个问题。