这是我在Java中的场景:
interface I{}
class A implements I{}
class B extends A{}
那么,现在哪个类需要实现接口的I方法?如果A和B类共享实现怎么办? 最好的问候
答案 0 :(得分:4)
class A
必须提供所有实施,因为它不是abstract
。有关详细信息,请参阅here。
class
B可以覆盖任何/所有这些方法。
如果你使A
抽象(作为一个类),那么它可以为接口中的那些方法提供abstract
方法(基本上只是将它们声明为abstract
)和{{1将提供唯一的实现。
答案 1 :(得分:1)
1)A类必须实现Interface I的方法。
2)但是,如果需要,B类可以覆盖这些定义。
3)如果A类没有实施,A类应该被宣布为抽象的,在这种情况下,B类应该实现这些。
答案 2 :(得分:0)
您只需要在A类中实现I接口。 (可选)您可以在B类中覆盖该实现,但如果不这样做,则两个类的行为方式相同(使用A实现)。
答案 3 :(得分:0)
声明implements
您承诺该类将实现某个接口。声明extends
您允许自己重用基类中的实现。 extends
隐含implements
。
因此,在您的情况下,您承诺A
将实施I
。接下来,您承诺B
也将实施I
,但会将A
的实施作为基础。
因此,您的模式假设B
与A
共享一些与A
有关的实现作为来源。如果这是你想要的就好了。
你也可以:
1)状态class B implements I
在这种情况下B
将属于它自己。
2)将大部分实现保留在某个第三类中,例如Base
,如下所示
interface I {}
class Base implements I {}
class A extends Base{}
class B extends Base{}
这种方式A
和B
具有同等的权利。
3)您可以在任意类中保存实现并使用聚合并装饰它:
interface I {
String method1(String a);
String method2(String a);
}
class ImplementationHolder1 // does not implement I!
{
String method1impl(String a) {};
}
class ImplementationHolder2 // does not implement I!
{
String method2impl(String a) {};
}
class A implements I {
ImplementationHolder1 h1;
ImplementationHolder2 h2;
String method1(String a) {
return h1.method1impl();
};
String method2(String a) {
return h2.method2impl();
};
}
请记住,如果没有完全实现接口,则应该创建类abstract
。
如果它不符合您的需要,您也可以覆盖后代类中的任何基类实现。