継承クラスでインターフェイスのすべてのメソッドを実装しない方法はありますか?
11 に答える
これを回避する唯一の方法は、クラスをとして宣言し、abstract
それをサブクラスに任せて、欠落しているメソッドを実装することです。しかし、最終的には、チェーン内の誰かがインターフェース契約を満たすためにそれを実装する必要があります。本当に特定のメソッドが必要ない場合は、それを実装してから、いずれか、return
またはさまざまなものをスローすることができNotImplementedException
ます。どちらか適切な方を選択してください。
インターフェイスは、一部のメソッドを「デフォルト」として指定し、インターフェイス定義内に対応するメソッド実装を提供することもできます(https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)。これらの「デフォルト」メソッドは、インターフェースの実装時に言及する必要はありません。
インターフェイスのポイントは、インターフェイスが指定したとおりにオブジェクトが外向きに動作することを保証することです。
インターフェイスのすべてのメソッドを実装しない場合は、インターフェイスの目的全体を破壊することになります。
親クラスのすべてのインターフェースメソッドをオーバーライドしabstract
、子クラスでは、その特定の子クラスに必要なメソッドのみをオーバーライドできます。
インターフェース
public interface MyInterface{
void method1();
void method2();
void method3();
}
抽象親クラス
public abstract class Parent implements MyInterface{
@Override
public void method1(){
}
@Override
public void method2(){
}
@Override
public void method3(){
}
}
あなたの子クラスで
public class Child1 extends Parent{
@Override
public void method1(){
}
}
public class Child2 extends Parent{
@Override
public void method2(){
}
}
そのクラスをクラスとして定義しabstract
ます。ただし、(サブクラスまたは匿名クラスを使用して) インスタンスを作成する場合は、これらの未実装のメソッドを実装する必要があります。
可能で簡単です。例をコーディングしました。
メソッドを実装するクラスから継承するだけです。インスタンス化できないクラスを気にしない場合は、クラスを定義することもできますabstract
。
Java8でそれを行うことができます。Java 8 では、「デフォルト メソッド」または (Defender メソッド) の新機能が導入されています。これにより、開発者は、これらのインターフェイスの既存の実装を壊すことなく、インターフェイスに新しいメソッドを追加できます。
具体的なクラスがそのメソッドの実装を提供できない状況でデフォルトとして使用されるインターフェイス定義の実装を許可する柔軟性を提供します。
interface OldInterface {
public void existingMethod();
default public void DefaultMethod() {
System.out.println("New default method" + " is added in interface");
}
}
//following class compiles successfully in JDK 8
public class ClassImpl implements OldInterface {
@Override
public void existingMethod() {
System.out.println("normal method");
}
public static void main(String[] args) {
ClassImpl obj = new ClassImpl ();
// print “New default method add in interface”
obj.DefaultMethod();
}
}
インスタンス化可能なクラスが必要な場合、それは不可能です。abstract
ただし、クラスを定義しようとすることもできます。