将方法委托给Java中的子类

Jus*_*ong 1 java inheritance

我有一个超类Shape,类Triangle,Square等扩展Shape.我有两个当前的问题:

  1. 我的方法Triangle extends Shape不编译.它必须返回一个Shape,而不是三角形.
  2. 我想隐藏这个方法.它应该只能从Shape超类中调用.
public class Shape {
  public static Shape createShapeFromXML(String xml) {
    String type = parse(xml);
      if (type.equals("Triangle") {
        Triangle.createShapeFromXML(xml);
      } else if (...) {
      // ...
    }
  }
}

public class Triangle extends Shape {
  public static Triangle createShapeFromXML(String xml) {
    ....
  }
}

public static void main(String[] args) {
  String xml = ...
  Shape s = Shape.createShapeFromXML(xml);
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这些问题?

hvg*_*des 6

为什么不在超类中保留一个静态方法,并让它返回适当的Shape子类?签名将保持不变,因为三角形与Shape有一种关系.

您可以将超类上的方法设为私有,以获得您想要的访问限制...

另一种方法是使用Factory模式.你可以拥有一个ShapeFactory ......这是一个好主意,因为创建xml解析不是Shape类的关注点.分开你的顾虑.维基百科链接擅长描述模式,但您可能想要一个更简单的示例.看到这个.