首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在覆盖实现中调用接口的默认实现?

如何在覆盖实现中调用接口的默认实现?
EN

Stack Overflow用户
提问于 2015-09-18 21:46:23
回答 4查看 303关注 0票数 4

假设我有以下代码:

代码语言:javascript
复制
interface HumanoidForm {
    default HumanoidForm reproduce() {
        <appropriate code for humanoid form reproduction>
    }
}

class Android extends Machine implements HumanoidForm {
    public HumanoidForm reproduce() {
        <appropriate code for android reproduction> // how to use HumanoidForm's default implementation here?
    }
}

现在假设“用于android复制的适当代码”最好使用“适当的类人形式复制代码”作为子例程来描述。如何从“android复制的适当代码”中访问“适当的类人形式代码”?我可以想出三种方法,但没有一种可行:

  • 只需调用reproduce()就可以调用覆盖的实现。
  • 写入((HumanoidForm)此).reproduce()仍然调用重写实现。
  • 通过重写方法来模仿超类中方法实现的重用,人们可能会想到编写super.reproduce()。然而,这指的是机器复制的实现,甚至可能不存在。

因此,似乎没有办法重复使用默认方法中的代码来重写。真的是这样吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-18 22:50:39

实际上,您可以自由选择现有的实现。让我给你一个比你的稍微复杂一些的场景。更糟糕的是,所有的ABC都有相同的方法签名。

代码语言:javascript
复制
interface A {
    default void doWork() {
       System.out.println("Default implementation From A");
    }
}

interface B{
    default void doWork() {
      System.out.println("Default implementation From B");  
    }   
}

class C{
    void doWork(){
        System.out.println("Default implementation From C");
    }       
}

现在,我为C创建了一个子类,它实现了A& B:

代码语言:javascript
复制
class Tester extends C implements A, B
{
    @Override public void doWork(){
        A.super.doWork();  //Invoke A's implementation
        B.super.doWork();  //Invoke B's implementation
        super.doWork();    //Invoke C's implementation
    }
}

输出为:

代码语言:javascript
复制
Default implementation From A
Default implementation From B
Default implementation From C

当您运行

代码语言:javascript
复制
new Tester().doWork();
票数 3
EN

Stack Overflow用户

发布于 2015-09-18 21:49:09

代码语言:javascript
复制
HumanoidForm.super.reproduce();
票数 4
EN

Stack Overflow用户

发布于 2015-09-18 21:51:48

看看这个:https://blog.idrsolutions.com/2015/01/java-8-default-methods-explained-5-minutes/

特别是其中的一节说:“如果我们想在InterfaceA或InterfaceB中具体调用一个InterfaceB()方法,我们也可以这样做:”

代码语言:javascript
复制
public class MyClass implements InterfaceA, InterfaceB {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
}

@Override
public void saySomething() {
    System.out.println("Hello World");
}

@Override
public void sayHi() {
   InterfaceA.super.sayHi();
}

}

interface InterfaceA {

public void saySomething();

default public void sayHi() {
    System.out.println("Hi from InterfaceA");
}

}

interface InterfaceB {
 default public void sayHi() {
    System.out.println("Hi from InterfaceB");
}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32661521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档