-1

假设我们有一个类实现接口扩展抽象类,在接口和抽象类中具有相同的抽象功能。然后类继承哪个函数接口或抽象类以及为什么。

喜欢:

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

2 回答 2

4

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

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

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

于 2012-11-08T10:07:55.923 回答
0

知道从哪个方法继承并不重要,因为方法InterfaceAbstract类中的方法都abstract意味着没有给出实现。

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

于 2012-11-08T10:12:13.577 回答