繁体   English   中英

扩展接口而不是实现它

[英]extending an interface instead of implementing it

接口定义(见下文)让我感到困惑:

public abstract interface Cursor {
    // hide details
}

public abstract interface Parcelable {
    // hide details
}

public interface Foo<T extends Bar> extends Cursor, Parcelable {
    // details omitted for brevity
};
  1. 我认为Java没有多重继承,因此一个类不能extends多个类。
  2. 另一方面,类/接口可以实现多个接口。 那么为什么使用extends而不是implements呢?

Java 7及以下版中的类/接口继承和实现规则如下:

  1. 一个类只能从一个类继承(单继承)
  2. 一个类可能实现一个或多个接口(多个接口实现)
  3. 接口可能从一个或多个接口继承(多接口继承)

继承时,使用关键字extends ,当类继承自类或接口继承自一个或多个接口时。 术语extends应理解如下: 此类/接口是其父类/接口的扩展 - 它是父或父的所有内容,甚至可能更多

当类实现接口(或多个接口)时,使用关键字implements 术语implements将被理解如下: 保证该类的实例提供父接口的方法的实现

另外,还要注意一个abstract class使用关键字implements指父接口时,即使抽象类本身不实现接口的方法。 这并不违反上述原则:只能有具体类的实例,必须实现每个声明的方法; 因此,该抽象类的任何实例实际上必须是从接口实现方法的子类的实例。 例如,这是完全有效的: abstract class AnAbstractClass implements Cursor {} ,即使Cursor声明了很多方法。

在您的示例中,接口Foo<T extends Bar>继承自另外两个接口,即CursorParcelable ,这是上面第3点的示例。 你使用关键字extends而不是implements因为接口Foo没有实现任何东西:仍然没有定义父接口方法的主体! 如果你有一个实现这两个父接口的类,你可以这样做:

class AClass implements Cursor, Parcelable {
  @Override public // ... method signature and implementation
                   // for every method in Cursor and Parcelable
}

另外,请注意,在声明接口时不需要使用关键字abstract :类型及其声明的所有方法都是隐式抽象的。 这些方法也是隐式公共的(并且不能用任何其他访问修饰符声明),因为接口的目的恰恰是声明“对象的公共接口”,也就是说,哪些方法可以保证公开。实现该接口的对象。


最后,上面描述的一些概念在Java 8中稍作修改:在该版本中,您将能够在接口中提供方法的“默认实现”,以防实现接口的类不实现它们。 事情将更类似于“类多重继承”:类将能够从多个源继承已实现的方法,这在Java 7或更低版​​本中是不可能的。 例如(语法尚未修复):

interface NaturalNumber {
  void increment();
  default void add(int n) {
    for (int i = 0; i < n; i++) {
      increment();
    }
  }
}

class NaturalNumberImplementation implements NaturalNumber {
  private int n = 0;
  @Override public void increment() { n++; }
}

这样做是为了让您在不想要的时候忽略实现某些方法,同时仍然能够在可能/需要时实现它们的“更好”版本。 例如:

class HighPerformanceNaturalNumberImplementation implements NaturalNumber {
  private int n = 0;
  @Override public void increment() { n++; }
  @Override public void add(int n) { this.n += n; }
}

答案1。

Java类只能扩展一个父类。 不允许多重继承。 但是,接口不是类,接口可以扩展多个父接口。

答案2。

当存在父子关系时,应始终扩展类/接口。 扩展类或接口应该没有其他原因。

接口:

  • 接口扩展接口。

  • 接口可以扩展多个接口。

类别:

  • Clases扩展了类。

  • 一个类只能扩展一个类。

  • 只有类可以实现接口。

  • 一个类可以实现多个接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM