如何覆盖实现接口

时间:2018-05-29 04:05:58

标签: java oop

我有一个接口Readable,我有一个实现它的类ReadableImpl

public interface Readable {
    void doThis();
    void doThat();
} 

public class ReadableImpl implements Readable {
    public void doThis() {
        System.out.println("do this");
    }

    public void doThat() {
        System.out.println("do that");
    }
}

如果我想覆盖方法doThis()该怎么办?我应该在另一个班级中实施Readable吗?

修改:我不想编辑课程ReadableImpl

4 个答案:

答案 0 :(得分:1)

从技术上讲,您正在ReadableImpl中实施(有些人称之为覆盖)。如果要再次覆盖,则必须在扩展ReadableImpl的类中,并且无需再次实现Readable。简单地说,

public class ReadableImpl2 extends ReadableImpl {
    @override
    public void doThis() {
        System.out.println("do this overriden");
    }

}  

答案 1 :(得分:0)

你的例子已经覆盖了它! 您可以直接覆盖课程doThis()中的ReadableImpl

只要在类中实现接口,就可以通过在该类中编写完全相同的方法名/返回类型/参数来覆盖接口中的任何方法。

答案 2 :(得分:0)

这取决于您需要做什么,以及您需要与ReadableImpl的兼容程度。

您可以继承ReadableImpl并覆盖doThis

public class ReadableImpl2 extends ReadableImpl {
    @override
    public void doThis() {
        System.out.println("do this 2");
    }
}

如果您无权访问实例,则可以使用代理:

public class ReadableProxy implements Readable {
    private final Readable delegate;

    public ReadableProxy(Readable delegate) {
        this.delegate = delegate;
    }

    public void doThis() {
        System.out.println("do this proxy");
    }

    public void doThat() {
        delegate.doThat();
    }
}

答案 3 :(得分:0)

你的问题

  

如果我想覆盖方法doThis(),我该怎么办?我是不是该   在另一个类中实现Readable?

我认为并不是很清楚,因为在与extend / implements相关的操作命名中有一些混合。因此,让我试着回答你的问题,解释一下使用你的例子:

public interface Readable {
    void doThis();
    void doThat();
} 

有了这样的界面,您可以使用implement关键字{/ 1>}在您选择的类中选择其方法

implements

现在,如果你想public class ReadableImpl implements Readable { public void doThis() { System.out.println("do this"); } public void doThat() { System.out.println("do that"); } } 这种方法,唯一的方法是创建一个override extends的新类,因为ReadableImpl意味着子类中更改父类方法的功能:

to override

但是如果你想要一种完全不同的处理方式,public class ReadableImplChild extends ReadableImpl{ @Override public void doThis() { System.out.println("do this more specific way"); } @Override public void doThat() { System.out.println("do that more specific way"); } } 处理ReadableImpl接口方法,你应该创建一个新类,它将{{1此界面引入新功能

Readable

你可以(我知道你不想,但你可以)implement一种方法。并且它意味着创建相同功能的新版本,该功能仅与方法参数的数量和/或类型不同

 public class ReadableTotallyDifferentImpl implements Readable {
        public void doThis() {
            System.out.println("do this totally another way");
        }

        public void doThat() {
            System.out.println("do that totally another way");
        }
    }

根据你提问:

  

如果我想覆盖方法doThis(),我该怎么办?

嗯,这取决于:

  1. 如果您想要稍微不同的功能(我会说,更具体的做事方式) - >你应该创建一个 子类覆盖其方法
  2. 如果您希望完全改变此界面,则应使用新课程并以不同方式实施
  3. 如果你真的必须使用 overload课程,但你希望这种方法的工作方式不同,你可以重载更改其实施