【发布时间】:2014-04-27 16:30:05
【问题描述】:
我有一个扩展抽象类的具体类,而抽象类又扩展了一个抽象类。这个顶级类实现了一个接口。是否可以在顶层抽象类中实现接口方法,让具体子类不用?
另外,如果接口方法采用 Object 类型作为它的参数,我可以让顶级抽象类中的实现采用另一种类型(这对我来说似乎是正确的),还是我必须使用完全相同的方法签名?
【问题讨论】:
我有一个扩展抽象类的具体类,而抽象类又扩展了一个抽象类。这个顶级类实现了一个接口。是否可以在顶层抽象类中实现接口方法,让具体子类不用?
另外,如果接口方法采用 Object 类型作为它的参数,我可以让顶级抽象类中的实现采用另一种类型(这对我来说似乎是正确的),还是我必须使用完全相同的方法签名?
【问题讨论】:
能不能在顶层抽象类中实现接口方法,让具体子类不用?
是的
另外,如果接口方法采用 Object 类型作为其参数,我可以让顶级抽象类中的实现采用另一种类型(这对我来说似乎是正确的),还是我必须使用完全相同的方法签名?
它必须是相同的签名。但是,如果您愿意并且更详细地解释您的计划,您可以使用泛型进行欺骗。
【讨论】:
为你的第一个问题
能不能在顶层抽象类中实现接口方法,让具体子类不用?
如果它是所有子类的共同特征,你可以而且应该这样做。
下面是同样的例子
interface X{
void show();
}
abstract class A implements X{
public void show(){
System.out.println("show");
}
}
abstract class B extends A{
}
class C extends B{
}
【讨论】:
第二个问题
不,签名必须始终相同。
所以下面的程序说明了它
interface X{
void print(Object obj);
}
abstract class A implements X{
@Override
public void print(Object obj) {
System.out.println("print");
}
}
如果更改子类中的类型,以下程序将无法编译
interface X{
void print(Object obj);
}
abstract class A implements X{
@Override
public void print(A obj) {
System.out.println("print");
}
}
【讨论】: