【问题标题】:avoid implementation of a method which is there in interface - java避免实现接口中存在的方法 - java
【发布时间】:2013-12-30 17:11:48
【问题描述】:

我有如下界面:

public interface a {
    public void m1();
    public void m2();
    public void m3();
}

public class A implements a {
    public void m3() {
        // implementation code     
    }
}

我想避免实现该方法的其余部分。一种方法是在尝试实现interface 的类中不实现所有方法。

如何避免这种情况。示例代码将帮助我更好地理解:)

【问题讨论】:

  • 那你为什么不用抽象类呢?
  • 如果您不准备实现所有成员,则不应该实现接口。也许接口需要拆分成多个接口?
  • 你不能。接口的目的是实现其方法。您可以将您的接口拆分为多个接口,并在需要时实现它们
  • 我不确定我是否理解您的问题。您是否在问如何在不实现接口中指定的方法时避免错误?如果是这样,那首先就违背了实现接口的目的,而且是不可能的。你可以实现空方法,尽管它什么都不做,但我仍然建议你重新考虑你的方法
  • 你不能避免它......一种方法是你可以在一个抽象类中实现所有这些方法并让你的类扩展它。我不知道这对你有什么帮助......

标签: java interface abstract-class


【解决方案1】:
public interface a{

      public void m1();
      public void m2();
      public void m3();

}

public abstract class A implements a{

       public void m3(){

           // implementation code     

           }

}

声明为抽象类,这样您就不需要在此类中实现这些方法。但是你必须在具体类中实现这些方法

【讨论】:

    【解决方案2】:

    TLDR;

    如果接口是给你的,那你就别无选择了。接口的创建者强制你实现它的所有方法。

    如果您正在编写界面,那么您可能弄错了。 如果您只想实现方法的子集,那么使用抽象类可能会更好。

    详细说明

    接口声明行为契约。其目的恰恰是强制所有实现类实现其所有方法,从而确保实现类符合约定。

    例如如下界面:

    public interface highlightable {
    
        public void highlight();
    
    }
    

    声明每个实现类必须并且将实现highlight()方法。因此,作为程序员,知道给定类实现了highlightable 接口,您就知道它可以以某种方式突出显示。

    理想情况下,一个好的接口应该如下指出每个方法的预期用途:

    /**
     * An interface for all things that can be highlighted.
     */
    public interface highlightable {
    
        /**
         * Implementations should make the subject stand out.
         */
        public void highlight();
    
    }
    

    所以当程序员编写实现代码时,很清楚需要做什么。

    【讨论】:

      【解决方案3】:

      Java 8 解决方案:

      使用 java 8 default methods 并将您的接口定义更改为

      public interface a {
          public void m1();
          public void m2();
          default void m3(){
              // Provide your default imp
          }
      }
      

      扩展包含默认方法的接口

      当您扩展包含默认方法的接口时,您可以执行以下操作:

      1. 根本不提默认方法,让你的扩展接口继承默认方法。
      2. 重新声明默认方法,使其抽象化。
      3. 重新定义默认方法,将其覆盖。

      根据您的要求,您可以跳过在某些类中实现此默认方法 (like A),或者您可以覆盖其他某些类中的默认方法或通过重新声明此方法将此方法的实现委托给其他某些类方法抽象。

      Java 7 或更早版本的解决方案

      将接口定义分解为两个子接口。

      public interface a {
          public void m1();
          public void m2();
      
      }
      
      public interface b{
        public void m3();
      }
      

      现在class A 将只实现interface a,其他类可以同时实现interface a and interface b

      【讨论】:

        【解决方案4】:

        使用abstract 类而不是接口。

        在这个抽象类中,

        1. 子类可选的方法 - 在抽象类中提供实现
        2. 子类强制的方法 - 在抽象类中声明为抽象,子类必须提供实现
        3. 子类不能覆盖的方法 - 在抽象类中声明为 final,并提供实现

        下面的例子:

        abstract class MyClass {
            public void m1(){}; //class A can override, optional
            final public void m2(){}; //class A CANNOT override, has to use implementation provided here
            abstract public void m3(); //class A MUST override, mandatory
        }
        
        class A extends MyClass {
        
            @Override
            public void m3() { //mandatory
        
            }
        }
        

        【讨论】:

          【解决方案5】:

          除了你说的,你最多只能让你上课A,abstract

          abstract class A implements a{
          
               public void m3(){
          
                   // implementation code     
          
                   }
          

          【讨论】:

            【解决方案6】:

            你应该试试Abstractclass。然后你可以决定哪些方法应该实现,哪些方法不应该实现。

            public abstract class A {
            
            public abstract void m1();
            
            public void m2() {
            
            }
            
            public void m3() {
            
            }
            

            }

            .

            public class B extends A{
            
            @Override
            public void m1() {   // you have to override m1 only
            
            }
            }
            

            【讨论】:

              【解决方案7】:

              如果您不想实现接口的其他方法,请使用实现此方法的虚拟类并在您的应用程序中继承该类。这就是所谓的适配器模式,广泛用于swing的适配器类中。

              【讨论】:

                【解决方案8】:

                一种解决方案是创建一个抽象类来实现您的接口的方法,而无需在其中编写代码。那么你的 A 类应该扩展抽象类并重写正确的方法。

                编辑:此解决方案使您的界面有点无用,除非它用于许多实现中。

                【讨论】:

                  【解决方案9】:

                  默认情况下,接口中的所有方法都是public abstract。 如果您不想为继承的abstract 方法添加实现,则需要将该类标记为abstract。

                  public abstract class A implements a {
                    // Compiler will not prompt you with an error message.
                    // You may add or do not add implementation for a method m3()
                  }
                  

                  注意:抽象类不能实例化。如果你想实例化它,要么添加空白实现,要么创建它的子类并在那里实现方法。

                  【讨论】:

                    【解决方案10】:

                    在 java 7 之前你不能这样做。如果你只想实现接口中提供的一些方法,你必须使类抽象。

                    但截至目前,Java 8 即将推出(尚未发布),并带有 lambdas 的特性。规范说您可以在接口本身中提供方法的默认实现。

                    例如

                    public interface A {
                        default void foo(){
                           System.out.println("Calling A.foo()");
                        }
                    }
                    
                    public class Clazz implements A {
                    }
                    

                    即使 Clazz 没有实现方法 foo(),代码也会编译。方法 foo() 默认实现现在由接口 A 提供。

                    【讨论】:

                      【解决方案11】:

                      你没有解释你为什么需要这个,所以让我猜猜。也许您需要一种快速的方法来为测试排除某些功能。或者你只是想编译一些东西,这样你就可以运行一些单元测试,然后回来完成剩下的。或者您可能怀疑某些方法是多余的并且永远不会在您的应用程序中调用。

                      这将涵盖以上所有内容:

                      public class A implements a {
                          public void m3() {
                              throw new UnsupportedOperationException("This functionality has not been implemented yet.");     
                          }
                      }
                      

                      【讨论】:

                      • 请添加一些关于您的解决方案的 cmet,说明它为什么以及如何解决问题
                      【解决方案12】:

                      如果您使用接口,则每个方法的实现都是强制性的。 但是,您可以通过以下方法避免这种情况:

                      • 在您的类中声明缺少的方法抽象。 这迫使你声明你的类 abstract 并因此迫使你 在您之前将类子类化(并实现缺少的方法) 可以创建任何对象。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-10-15
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多