如何调用过度的抽象类方法

Amo*_*kar 0 java inheritance abstract-class abstract

我喜欢这样的场景

这是抽象类

    abstract class A
    {
            public void add()
            {
                    //do something
            }
    }
Run Code Online (Sandbox Code Playgroud)

这是扩展到抽象类之上的类

    class B extends A
    {
            @Override
            public void add()
            {
                    //do something else
            }
    }
Run Code Online (Sandbox Code Playgroud)

这是我想要调用add方法的类

    class C
    {
            A a = new B();

            // Calls B's add method

            a.add();

            // Call A's add method ???
    }
Run Code Online (Sandbox Code Playgroud)

如何调用A的添加方法???

Jon*_*eet 9

你不能.这就是多态性和封装的全部要点 - 你已经创建了一个实例B,所以B要决定什么add意思.也许B正试图强制执行一些关于何时可以调用的业务规则add- 如果你可以绕过这些规则并A.add()直接调用一个实例,那将毫无用处B.的实施B.add()可以何时以及是否调用决定super.add(),但代码之外 B没有得到做出决定.

  • "你不能"是非常失败的 - C++也有多态性,但如果你更喜欢调用基类的实现,你可以高兴地说`bA :: add()`(即使`A :: add()`是纯虚拟的... ... :-)我想更合适的措辞是"Java决定了设计,为了您的安慰,不让您接受任何不必要的选择." (2认同)
  • @KerrekSB:我不认为它是失败主义,但不像C++那样被打破.能够做到这一点是件好事,所以它比失败者更乐观. (2认同)