我有一个有几个孩子的家长班。其中一个孩子有一个被覆盖的方法,对于其特定的内部使用,需要一个更多的参数。我不想更改方法的签名,因为其他子节点中的重写方法不需要此参数,我也不想添加类属性,因为在这种情况下它没有意义。
你如何处理这些情况?
到目前为止,我已经在方法中添加了一个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 {
}
嗯,不,我在这里完全错了,我不明白你帖子的第二部分,请问你能否对此有所了解?
答案 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
需要CoolAlgorithmParameter
而NiceAlgorithm
需要NiceAlgorithmParameter
,所以您不必担心参数对象实际上是您想要的 - 仿制药将会解决这个问题。