避免实现接口中的方法 - java

时间:2013-12-12 10:31:33

标签: java interface abstract-class

我有一个如下界面:

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

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

我想避免实现其余的方法。一种方法是让所有方法在试图实现interface的类中没有实现。

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

12 个答案:

答案 0 :(得分:3)

public interface a{

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

}

public abstract class A implements a{

       public void m3(){

           // implementation code     

           }

}

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

中实现这些方法

答案 1 :(得分: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. 重新定义默认方法,该方法会覆盖它。
  4. 根据您的要求,您可以跳过在某些类(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

答案 2 :(得分:2)

接口的目的正是强制所有实现类实现接口的方法,从而确保类与接口兼容。

如果您只想实现方法的一个子集,也许它不是您应该首先实现的接口。

答案 3 :(得分:2)

使用abstract类而不是接口。

在这个抽象类中,

  1. Child类的可选方法 - 在抽象类中提供实现
  2. 对于Child类强制的方法 - 在抽象类中声明为abstract,子类必须提供实现
  3. 子类无法覆盖的方法 - 在抽象类中声明为final,并提供实现
  4. 以下示例:

    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
    
        }
    }
    

答案 4 :(得分:1)

除了你所说的,你可以做的最大值就是让你上课Aabstract

abstract class A implements a{

     public void m3(){

         // implementation code     

         }

答案 5 :(得分:0)

您应该尝试Abstract class。然后你可以决定应该实现什么方法以及不用的方法是什么。

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

}
}

答案 6 :(得分:0)

默认情况下,界面中的所有方法都是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()
}

注意:抽象类无法实例化。如果要实例化它,可以添加空白实现或创建它的子类并在那里实现该方法。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

这样做的一个解决方案是创建一个Abstract类来实现接口的方法而不需要代码。然后你的类A应该扩展抽象类并覆盖正确的方法。

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

答案 9 :(得分:0)

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

但到目前为止,Java 8即将推出(尚未推出)lambda的功能。规范说您可以在接口本身中提供方法的默认实现。

例如

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

public class Clazz implements A {
}

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

答案 10 :(得分:0)

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

这将涵盖以上所有内容:

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

答案 11 :(得分:0)

如果使用接口,则必须强制执行每种方法。 但是,可以通过以下方法避免这种情况:

  • 在您的类中声明缺少的方法摘要。 这迫使您声明您的课程抽象,结果迫使您 在您继承类的子类之前(并实现缺少的方法) 可以创建任何对象。