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

时间:2011-11-10 13:37:43

标签: java inheritance abstract-class abstract

我有像

这样的场景

这是抽象类

    abstract class A
    {
            public void add()
            {
                    //do something
            }
    }

这是扩展到抽象类

之上的类
    class B extends A
    {
            @Override
            public void add()
            {
                    //do something else
            }
    }

这是我想要调用add方法

的类
    class C
    {
            A a = new B();

            // Calls B's add method

            a.add();

            // Call A's add method ???
    }

如何调用A的add方法???

6 个答案:

答案 0 :(得分:9)

你做不到。这就是多态性和封装的全部要点 - 您已经创建了B的实例,因此B可以决定add的含义。也许B正试图强制执行一些关于何时可以调用add的业务规则 - 如果您可以绕过这些规则并直接在{{{{}}的实例上调用A.add(),那将毫无用处1}}。 B的实施可以决定何时以及是否致电B.add(),但 super.add()之外的代码无法做出决定。

答案 1 :(得分:1)

你不能,因为它会破坏多态性。如果B覆盖A的add方法,那是因为必须以另一种方式添加以满足其合同。不是以它需要的方式来打破B的不变量,也可能是A的不变量。

答案 2 :(得分:1)

您正在寻找super

class B extends A
{
        //over ride method
        public add()
        {
                super.add();
                //do something else
        }
}

答案 3 :(得分:1)

如上所述,各种各样的人,你不能。如果我们尝试理解你想要实现的目标,我想你需要的是一个接口和两个类。

interface AddInterface {
 public void add();
}

class A implements AddInterface {
//your abstract class' version of add goes here
}

class B implements AddInterface {
//your other add definition.
}

您最终会使用AddInterface替换对A的引用。 同样,这一切都取决于你想要达到的目标。

答案 4 :(得分:1)

class B extends A
{
//over ride method
public add()
{
    //do something else
}

public add2()
{
    super.add();
}
}


class C {
A a = new B();

// Calls B's add method
a.add();

// Call A's add method
a.add2();
}

答案 5 :(得分:0)

我得到了我想要的但是以不同的方式在这里是如何---

    class D extends A
    {
            public add()
            {
                    //Log here..........
                    super.add();
            }
    }

这将帮助我不要强迫B通过避免super.add()来调用A的默认实现;

因为我们已经过度使用它来改变功能。

    class C
    {
            A a = new B();
            // Call B's Add method
            a.add();

            a = new D();
            // Call A's Add method via D
            a.add();
    }

我认为没有比这更好的方法了:)