从哪里继承功能?为什么?

时间:2012-11-08 10:03:13

标签: java inheritance

假设我们有一个类实现接口扩展抽象类,在接口和抽象类中都使用相同的抽象函数。然后类继承哪个函数接口或抽象类以及原因。

像:

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();    
 }

2 个答案:

答案 0 :(得分:4)

两者。只要函数签名匹配,编译器就会接受这种“双重” - 继承。请记住,实现接口的方法只是您的类必须验证可编译的“合同”。实现接口只意味着“我的具体类必须有一个方法set()”。扩展抽象类B意味着“我的具体类从其超类继承方法set(),并且因为它被定义为抽象,它需要实现它”。当这两个命题都匹配时(根据你的例子),一切都很好。

如果接口和抽象类之间的函数签名存在差异,那么具体类必须实现两个版本。

BTW,稍微偏离主题,尽量避免抽象类。如果抽象类只有抽象方法,那么它应该是一个接口。如果它的某些方法中有一些代码,那么你应该考虑重构它以使用组合而不是继承。继承是邪恶的;)

答案 1 :(得分:0)

知道从哪个方法继承是没有关系的,因为InterfaceAbstract类中的方法都是abstract,这意味着没有给出实现。

因此,您必须在具体类中确保必须implement接口中定义但未在抽象类中实现的所有方法。并实现其超类中定义的所有抽象方法(即使它们未在接口中定义)(来自Guillaume)