假设我们有一个类实现接口扩展抽象类,在接口和抽象类中都使用相同的抽象函数。然后类继承哪个函数接口或抽象类以及原因。
像:
public class A extends B implements I
{
public void set()
{
// Some code here
}
}
接口:
public interface I {
public void set();
}
抽象类:
public abstract class B
{
public abstract void set();
}
答案 0 :(得分:4)
两者。只要函数签名匹配,编译器就会接受这种“双重” - 继承。请记住,实现接口的方法只是您的类必须验证可编译的“合同”。实现接口只意味着“我的具体类必须有一个方法set()”。扩展抽象类B意味着“我的具体类从其超类继承方法set(),并且因为它被定义为抽象,它需要实现它”。当这两个命题都匹配时(根据你的例子),一切都很好。
如果接口和抽象类之间的函数签名存在差异,那么具体类必须实现两个版本。
BTW,稍微偏离主题,尽量避免抽象类。如果抽象类只有抽象方法,那么它应该是一个接口。如果它的某些方法中有一些代码,那么你应该考虑重构它以使用组合而不是继承。继承是邪恶的;)答案 1 :(得分:0)
知道从哪个方法继承是没有关系的,因为Interface
和Abstract
类中的方法都是abstract
,这意味着没有给出实现。
因此,您必须在具体类中确保必须implement
接口中定义但未在抽象类中实现的所有方法。并实现其超类中定义的所有抽象方法(即使它们未在接口中定义)(来自Guillaume)