【问题标题】:What if my subclasses have different methods too?如果我的子类也有不同的方法怎么办?
【发布时间】:2020-06-10 18:46:32
【问题描述】:

我有一个关于 Java 中的多态性的问题。我有一个抽象基类Shape 和两个派生类RectangleCircle。我知道我可以使用Shape 类引用调用CircleRectangle 类中的重写方法,但是如果我有一个Shape 类没有但Circle 类有的方法怎么办。在这种情况下如何使用多态性?

【问题讨论】:

  • What if I have a method that Shape class doesn't have but Circle class has. - 你不能使用Shape的引用直接调用这个方法。

标签: java class oop inheritance polymorphism


【解决方案1】:

在这种情况下你不能使用多态性。多态性的真正想法是,您可以以指定的方式使用对象,而不管其实际形状(特定对象类型)如何。通过要求访问(字面上)特定形状独有的方法,您必须放弃多态性。

如果Circle 确实有子类,则上述参数将不适用,在这种情况下,您可以多态地调用这些方法,但这只是将参数移到其他地方。)

【讨论】:

    【解决方案2】:

    这种情况一直在发生。答案是您需要将 Shape 转换为 Circle 才能访问该方法

    Shape s = ...;
    if (s instanceof Circle) {
      ((Circle)s).foo(); //method only on Circle
    }
    

    【讨论】:

      【解决方案3】:

      如果将 Circle 存储在 Shape 实例中,则可以通过将 s 转换为 Circle 来调用 s 上的 Circle 方法:

      Shape s = new Circle();
      ...
      if ( s.instanceof(Circle) ) {
         ((Circle)s).circleMethod();
      }
      

      【讨论】:

        【解决方案4】:

        除了其他答案建议的转换解决方案之外,如果您认为Shape 的所有子类都应该提供该方法但您不能/不想在Shape 上实现它,您可以将该方法声明为抽象并实现CircleRectangle中的方法。

        public abstract class Shape {
            public abstract void foo();
        }
        
        
        public class Circle extends Shape {
            public void foo() {
                // Implementation
            }
        }
        

        那么你可以这样做:

        Shape s = new Circle();
        s.foo();
        

        【讨论】:

        • 但是如果 Circle 类有另一个 Shape 类没有的方法呢?
        • 然后,如果Shape 实例在程序上下文中具有该方法有意义,则可以将具有相同签名的抽象方法声明添加到Shape 类。如果该方法不适合Shape,您可以使用其他答案中提供的强制转换方法。它是否“有意义”很可能是针对您的问题领域的设计决策,而不是实施决策。
        猜你喜欢
        • 2019-12-19
        • 2015-10-23
        • 2010-10-23
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多