我有一个抽象类,它实现了两个接口。我的想法是对的吗?因为我使用了两个接口,所以我不能使用任何一个接口来实现动态绑定?原因是,如果我使用其中一个接口,我显然无法从另一个接口调用方法,因为类型系统只允许子类型调用由我用来声明多态变量的接口定义的方法?
因此,我的实际问题是,我只是真正使用接口来确保我的抽象类(或子类)确实为方法提供了实现,这可以吗?这似乎与第19项所说的相矛盾——你应该只为类型使用接口(我认为这意味着多态性)。
示例:
public interface A{
public void meth1();
}
public interface B{
public void meth2();
}
public abstract class C implements A,B{
}
public void DynamicBinding(A aobject){
//Can only call aobject.meth1();
}
您可以使用泛型让您的方法接受类型a和类型B:的参数
public <T extends A & B> void method(T param) {
param.meth1(); // fine
param.meth2(); // also fine
}
此处的相关问题
当您只需要来自A
的方法时,A
可以用作对象的类型,如您所示。与CCD_ 3类似。如果你需要这两种方法,你可以制作一个新的界面:
public interface C extends A, B {
}
接口允许extend
多个接口。
然后,如果您愿意,您可以添加一个具有默认实现的抽象类:
public abstract class D implements C {
// implementation details
}
您可以进行
public void DynamicBinding(C cobject){
c.meth1();
c.meth2();
}
或稍差的变体
public void DynamicBinding(A aobject){
if(aobject instanceof C)
{
C myC=(C)aobject;
myC.meth1();
myC.meth2();
}
}
不管怎样,我喜欢乔做得更好。