避免实现接口java中的方法

避免实现接口java中的方法,java,interface,abstract-class,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 } } 我希望避免实现该方法的其余部分。一种方法是让所有方法都不在试图实现接口的类中实现 我如何避免这种情

我有一个如下所示的界面:

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

public class A implements a {
    public void m3() {
        // implementation code     
    }
}
我希望避免实现该方法的其余部分。一种方法是让所有方法都不在试图实现
接口的类中实现


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

除了你所说的,你能做的最多就是让你的类
A
抽象

abstract class A implements a{

     public void m3(){

         // implementation code     

         }

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

您应该尝试
抽象类
。然后,您可以决定应该实现什么方法以及不应该实现什么方法

public abstract class A {

public abstract void m1();

public void m2() {

}

public void m3() {

}
}


默认情况下,界面中的所有方法都是
公共摘要
。 如果不想为继承的
抽象
方法添加实现,则需要将类标记为
抽象

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

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

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

一种解决方案是创建一个抽象类来实现接口的方法,其中不包含代码。然后类A应该扩展抽象类并重写正确的方法

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

TLDR; 如果接口是给你的,那么你别无选择。接口的创建者强制您实现其所有方法

如果您正在编写接口,那么您可能弄错了。 如果您只想实现方法的一个子集,那么最好使用抽象类

详细地 接口声明了一个行为契约。其目的正是强制所有实现类实现其所有方法,从而确保实现类符合契约

例如,以下界面:

public interface highlightable {

    public void highlight();

}
声明每个实现类必须并且实现
highlight()
方法。因此,作为一名程序员,知道给定类实现了可高亮显示的接口可以让您知道它可以以某种方式高亮显示

理想情况下,一个良好的接口应表明其每个方法的预期目的,如下所示:

/**
 * An interface for all things that can be highlighted.
 */
public interface highlightable {

    /**
     * Implementations should make the subject stand out.
     */
    public void highlight();

}

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

在java 7之前,您无法完成这项工作。如果只想实现接口中提供的某些方法,则必须将类抽象化

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

比如说

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

public class Clazz implements A {
}

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

使用
abstract
类而不是接口

在这个抽象类中

  • 子类的可选方法-在抽象类中提供实现
  • 子类必须使用的方法-在抽象类中声明为抽象,子类必须提供实现
  • 子类不能重写的方法-在抽象类中声明为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
    
        }
    }
    

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

    这将涵盖上述所有方面:

    public class A implements a {
        public void m3() {
            throw new UnsupportedOperationException("This functionality has not been implemented yet.");     
        }
    }
    
    使用Java 8的解决方案:

    使用Java8并将接口的定义更改为

    public interface a {
        public void m1();
        public void m2();
        default void m3(){
            // Provide your default imp
        }
    }
    
    扩展包含默认方法的接口

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

  • 根本不提默认方法,它允许扩展接口继承默认方法
  • 重新声明默认方法,使其变得抽象
  • 重新定义默认方法,该方法将覆盖它
  • 根据您的要求,您可以跳过在某些类中实现此默认方法(
    ,如
    ),也可以重写某些其他类中的默认方法,或者通过将此方法重新声明为抽象,将此方法的实现委托给某些其他类

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

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

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

    现在
    类A
    将只实现
    接口A
    ,而其他类可以同时实现
    接口A和接口b

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

    • 声明类中缺少的抽象方法。 这迫使你声明你的类抽象,结果迫使你 在创建类之前,对类进行子类化(并实现缺少的方法) 可以创建任何对象

    那么为什么不使用抽象类呢?如果不准备实现所有成员,就不应该实现接口。也许是界面
    public interface a {
        public void m1();
        public void m2();
        default void m3(){
            // Provide your default imp
        }
    }
    
    public interface a {
        public void m1();
        public void m2();
    
    }
    
    public interface b{
      public void m3();
    }