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_Ooad - Fatal编程技术网

Java 处理具有嵌套对象的父类和子类的继承

Java 处理具有嵌套对象的父类和子类的继承,java,oop,ooad,Java,Oop,Ooad,假设我有一个扩展类父级的类子级。类子级有两个嵌套类nested1和nested2。我希望在父级中定义一个抽象函数,参数为nested1,返回类型为nested2。现在,为了实现这一点,我创建了一个同时使用参数和返回类型作为对象的函数 所以现在,当我实现子类时,我总是需要将对象强制转换为nested1和nested2。我觉得有更好的方法来实现这一点。有没有更好的方法来降低复杂性 还附上了UML 从键入的角度来看,最好的方法是在父类中创建一个接口,指定子类中的嵌套类。这样,就不需要将参数强制转换为f

假设我有一个扩展类父级的类子级。类子级有两个嵌套类nested1和nested2。我希望在父级中定义一个抽象函数,参数为nested1,返回类型为nested2。现在,为了实现这一点,我创建了一个同时使用参数和返回类型作为对象的函数

所以现在,当我实现子类时,我总是需要将对象强制转换为nested1和nested2。我觉得有更好的方法来实现这一点。有没有更好的方法来降低复杂性

还附上了UML

从键入的角度来看,最好的方法是在父类中创建一个接口,指定子类中的嵌套类。这样,就不需要将参数强制转换为func。这本身并没有降低复杂性,但它确实让你的意图更加清晰,减少/消除了铸造的需要(总是一件好事)


在更广泛的范围内,您应该问问自己,为什么每个孩子都需要自己的嵌套类集。如果您可以将嵌套类定义移动到父类(并使其成为静态的),并且在构建过程中让子类根据需要对其进行自定义,那么这将变得更简单。

从键入的角度来看,最好的方法是在父类中创建一个接口,指定子类中的嵌套类。这样,就不需要将参数强制转换为func。这本身并没有降低复杂性,但它确实让你的意图更加清晰,减少/消除了铸造的需要(总是一件好事)


在更广泛的范围内,您应该问问自己,为什么每个孩子都需要自己的嵌套类集。如果您可以将嵌套的类定义移动到父类(并使其成为静态的),并且只需让子类在构建过程中根据需要对其进行自定义,这将变得更加简单。

谢谢。嵌套类的定义在所有子类中都是不同的。所以我不能将它们作为单独的静态类。你能想出一个更好的方法来改进设计吗?既然如此,设计的问题是为什么你需要在父级中使用抽象方法?假设我有
Parent p=…
但我不知道它的类型,我可以用正确的参数调用
p.func(…)
?如果没有,那就没有必要用抽象的方法了谢谢。嵌套类的定义在所有子类中都是不同的。所以我不能将它们作为单独的静态类。你能想出一个更好的方法来改进设计吗?既然如此,设计的问题是为什么你需要在父级中使用抽象方法?假设我有
Parent p=…
但我不知道它的类型,我可以用正确的参数调用
p.func(…)
?如果没有,那么使用抽象方法就没有意义了
public abstract class Parent {

  interface Interface1 {
      //Specifications of methods that all child nested classes must have
  }

  interface Interface2 {
      //Specifications of methods that all child nested classes must have
  }

  public abstract Interface2 func(Interface1 obj);

}

public class Child extends Parent {

  private static class Impl1 implements Interface1 {
      //Implementations of methods in Interface1 as they pertain to Child
  }
  private static class Impl2 implements Interface2 {
      //Implementations of methods in Interface2 as they pertain to Child
  }


  @Override
  public Interface2 func(Interface1 obj) {
    //Should only have to use methods declared in Interface1
    //Thus should have no need to cast obj.

    //Will return an instance of Impl2
    return null;
  }
}