JavaRush /Java Blog /Random-JA /インターフェースのデフォルトメソッド

インターフェースのデフォルトメソッド

Random-JA グループに公開済み
Java の新しいバージョンはそれぞれ、以前のバージョンとは異なります。ここで説明した内容からの変更の例を次に示します。 Java 5 より前には、enum言語に はありませんでした。
インターフェイスのデフォルトのメソッド - 1
同様に、Java 8 は Java 7 とは著しく異なります。講義のほとんどは言語の第 7 バージョンで書かれていますが、もちろん、重要な革新を無視するわけではありません。この講義ではインターフェースについて話しているので、更新の 1 つであるインターフェースのデフォルトのメソッドを見てみましょう。インターフェースが を実装していないことはすでにご存知でしょう。そのタスクは、それを実装するすべてのオブジェクトがどのような動作をするべきかを記述することです。しかし、開発者は、すべてのクラスのメソッドの実装が同じであるという状況に遭遇することがよくありました。古い車の例を見てみましょう。

public interface Car {

   public void gas();
  
   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
このコードの主な問題は何だと思いますか? おそらく、同じコードをたくさん書いたことに気づいたでしょう。この問題はプログラミングではよくあるものであり、回避する必要があります。もう 1 つは、Java 8 のリリース前には、特別なソリューションのオプションがなかったことです。このバージョンが登場すると、デフォルトのメソッドを定義し、インターフェース内で直接実装できるようになりました。その方法は次のとおりです。

public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
すべてのマシンで同じだったメソッドgas()brake()がインターフェイスに含まれるようになり、重複したコードは必要なくなりました。さらに、メソッドは各クラスで利用可能です。

public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
メソッドを持つクラスが 100 個ありgas()、そのうちの 99 個だけが同じ動作をする場合はどうなるでしょうか? これではすべてが台無しになります。この場合、デフォルトの方法は機能しません。もちろんそうではありません:) インターフェイスのデフォルトのメソッドはオーバーライドできます。

public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
他の 99 種類のマシンはすべてデフォルトのメソッドを実装し、クラスUnusualCar(例外) は全体像を損なうことなく、その動作を冷静に決定します。インターフェイスの多重継承 すでにご存知のとおり、Java には多重継承はありません。これには多くの理由がありますが、それらについては別の講義で詳しく説明します。他の言語、たとえば C++ では、その逆になります。多重継承がないと、同じオブジェクトがさまざまな特性や「動作」を持つ可能性があるという深刻な問題が発生します。人生の例として、親にとっては子供、教師にとっては学生、医師にとっては患者です。人生において、私たちはさまざまな役割を果たし、それに応じてさまざまな行動をします。教師に対しては、親しい友人に対してとは明らかに異なる方法で話します。この状況をコードに変換してみましょう。Pond と Aviary という 2 つのクラスがあると想像してみましょう。池の場合は泳ぐ鳥が必要で、鳥小屋の場合は飛ぶ鳥が必要です。これを行うために、2 つの基本クラス (FlyingBirdと )を作成しましたWaterfowl

public class Waterfowl {
}

public class FlyingBird {
}
したがって、クラスが から継承された鳥を鳥小屋に送りFlyingBird、 から子孫を継承する鳥を池に送りますWaterfowl。すべてがシンプルに思えます。しかし、どこかでアヒルを特定する必要がある場合はどうすればよいでしょうか? 彼女は泳ぐことも飛ぶこともできます。しかし、多重継承はありません。幸いなことに、Java にはインターフェースの複数の実装が用意されています。クラスが複数の親から継承できない場合、複数のインターフェイスを実装するのは簡単です。私たちのアヒルは飛んだり泳いだりすることができます :)目的の結果を達成するには、クラスではなく FlyingBirdインターフェイスを使用するだけで十分です。Waterfowl

public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе
  
   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
このおかげで、私たちのプログラムは柔軟なクラス管理を維持し、デフォルトのメソッドの実装と組み合わせることで、オブジェクトの動作を定義する能力はほぼ無制限になります。:)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION