代码之家  ›  专栏  ›  技术社区  ›  Alberto Zaccagni

继承的方法还需要一个参数

  •  5
  • Alberto Zaccagni  · 技术社区  · 15 年前

    我有一个有几个孩子的家长班。其中一个子级具有一个重写方法,对于其特定的内部用法,该方法还需要一个参数。我不想更改方法的签名,因为其他子代中的重写方法不需要此参数,而且,我不想添加类属性,因为在这种情况下它是无意义的。

    你如何处理这些情况?

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


    在乔恩·斯基特的回答后编辑

    我会试着弄明白乔恩的建议。这很有趣。

    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 回复  |  直到 15 年前
        1
  •  10
  •   Jon Skeet    15 年前

    听起来你在那里没有一个真正的继承关系-它中断了 Liskov's Subtitutability Principle 因为如果没有额外的知识,您不能像使用父级的实例那样使用这个“子级”。

    如何使“child”类不是从“parent”派生的,而是在子类上提供一个方法 创造 父类的某个子类的实例,哪个子类“知道”适当的额外信息位?如果你能给我们更多关于类正在做什么的信息,我们可以给我们更多关于代码可能是什么样子的具体例子。

    编辑:在不了解更多关于你正在做什么的情况下,很难做到更清楚,但类似于:

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

    ChildWithParameter 然后类可以重写适当的方法 没有 获取任何额外的信息,因为它已经将其作为自身内部状态的一部分。

        2
  •  5
  •   Brian Agnew    15 年前

    虽然同意Jon关于继承模型被破坏的观点,但是您 可以 通过使用特殊的参数对象来处理类似的场景。也就是说,没有方法:

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

    你有一个物体 ParameterObject 其中包含所需的参数,您的方法如下:

    void myMethod(ParameterObject param);
    

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

    如果我正在写一个方法,而且参数的数量似乎过多, 我相信我的封装不会以任何方式被破坏(当方程/模型需要大量输入时,在金融软件中会发生很多这种情况),然后我发现上面的模式非常有用。

        3
  •  0
  •   Community CDub    8 年前

    你甚至可以进一步扩展 ParameterObject (如由 Brian Agnew )通过使用仿制药。

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

    这样你 CoolAlgorithm 采取了 CoolAlgorithmParameter 你的 NiceAlgorithm 采取了 NiceAlgorithmParameter 因此,您不必担心参数对象实际上是您想要的,泛型将负责处理。