我有一个如下界面:
public interface a {
public void m1();
public void m2();
public void m3();
}
public class A implements a {
public void m3() {
// implementation code
}
}
我想避免实现其余的方法。一种方法是让所有方法在试图实现interface
的类中没有实现。
我该如何避免这种情况。示例代码可以帮助我更好地理解:)
答案 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
}
}
扩展包含默认方法的界面
扩展包含默认方法的界面时,可以执行以下操作:
根据您的要求,您可以跳过在某些类(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
类而不是接口。
在这个抽象类中,
以下示例:
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)
除了你所说的,你可以做的最大值就是让你上课A
,abstract
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)
如果使用接口,则必须强制执行每种方法。 但是,可以通过以下方法避免这种情况: