【问题标题】:How to override method in class that implements interface如何覆盖实现接口的类中的方法
【发布时间】:2018-05-29 04:05:58
【问题描述】:

我有一个接口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

【问题讨论】:

  • 你到底想在这里做什么? doThis() 是否有您想到的两种行为或其他行为?
  • 你在ReadableImpl中实现了doThis()。如果您想覆盖该方法,它必须在扩展ReadableImpl 的其他类中。如果你想在课堂上重写,你必须让你的基础知识正确。在一个类中,它的overloading 有其约束。
  • 你已经覆盖了(我应该说实现了),不是吗?
  • @Ran 我应该创建另一个类public class ReadableImpl2 extends ReadableImpl implements Readable 吗?
  • 根据你想做的事情,你可能会发现 overload doThis 在同一个类中是可以接受的,例如,只需更改另一个类的方法签名行为。

标签: java oop


【解决方案1】:

从技术上讲,您正在ReadableImpl 中实现(有人称之为覆盖)。如果你想再次覆盖它必须在一个扩展 ReadableImpl 的类中,并且不需要再次实现 Readable。很简单,

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

}  

【讨论】:

  • 我同意@Ran 关于所提供的解决方案,但我不同意解释:“implementingis notoverriding" ,正如 here 所说
  • @HJuls2 确实如此,因为您可以使用抽象方法覆盖方法而无需实现......
  • @Holger 是的,你说的是允许的,但老实说,我看不出这种场景的实际用途......
  • @HJuls2 好吧,可能是继承的实现不适合特定的合约,子类必须用不同的实现覆盖它。有时,一个抽象方法会覆盖另一个抽象方法,只是为了有一个包含扩展合同描述的文档注释。
【解决方案2】:

您的示例已经覆盖了它! 您可以直接覆盖 ReadableImpl 类中的 doThis()

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

【讨论】:

    【解决方案3】:

    这取决于您需要做什么,以及您需要与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();
        }
    }
    

    【讨论】:

      【解决方案4】:

      你的问题

      如果我想重写方法doThis(),我应该怎么做?我是不是该 在另一个类中实现 Readable?

      我认为不是很清楚,因为与扩展/实现相关的操作命名混合在一起。所以让我试着回答你的问题,用你的例子解释周围的一切:

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

      拥有这样的接口,您可以使用implements关键字在您选择的类中implement其方法

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

      现在如果你想override这个方法,唯一的办法就是创建一个新的类extendsReadableImpl,因为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 正在处理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");
              }
          }
      

      你可以(我知道你不想要,但你可以)overload一个方法。这意味着创建相同功能的新版本,仅在方法参数的数量和/或类型方面有所不同

      public class ReadableImpl implements Readable {
          public void doThis() {
              System.out.println("do this");
          }
      
          public void doThat() {
              System.out.println("do that");
          }
      
          /**
           * this is funciton overloading
           */
          public void doThat(String userSpecific) {
              System.out.println("do that for:" + userSpecific);
          }
      }
      

      根据你的问题:

      如果我想重写方法doThis()怎么办?

      好吧,这取决于:

      1. 如果你想要稍微不同的功能(我想说,更具体的做事方式)-->你应该创建一个 子类,并覆盖其方法
      2. 如果你想要这个接口完全不同的实现,你应该使用新的类并以不同的方式实现它
      3. 如果你真的必须使用ReadableImpl类,但你希望这个方法以不同的方式工作,你可以重载它, 或更改其实现

      【讨论】:

        猜你喜欢
        • 2014-11-20
        • 2012-12-04
        • 2012-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 2022-01-01
        • 2015-04-29
        • 1970-01-01
        相关资源
        最近更新 更多