我有像
这样的场景这是抽象类
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方法???
答案 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();
}
我认为没有比这更好的方法了:)