2016-06-24 19 views
1

私はJavaを学び、インターフェイスの継承について混乱しています。本Javaインターフェイスの継承の競合するメソッド

public interface Singer { 
     void sing(); 
     void setRate(double rate); 
     double getRate(); 
    } 

    public interface Player { 
     void play(); 
     void setRate(double rate); 
     default double getRate() { 
     return 300.0; 
     } 
    } 

public interface SingerPlayer extends Singer, Player{ 
     // Override the getRate() method with a default method that calls the 
     // Player superinterface getRate() method 
    @Override 
    default double getRate() { 
      double playerRate = Player.super.getRate(); 
      double singerPlayerRate = playerRate * 3.5; 
      return singerPlayerRate; 
    } 
} 


public class Employee implements Singer, SingerPlayer { 

} 

本からの例では、それがSinger.setRate()メソッドをオーバーライドするため、従業員がSingerPlayer.setRate()メソッドを継承しますと言います。

私はこのメソッドをオーバーライドしていません。

+1

デフォルトでは、interfaceのメソッドは抽象メソッドであり、抽象メソッドはボディを指定しません。だからまず第一にあなたは 'プレーヤー'のインターフェイスを修正する必要があります。 – Kartic

+1

@Karticインターフェースのデフォルトのメソッドは現在のものですhttp://www.tutorialspoint.com/java8/java8_default_methods.htm – jonhopkins

+0

ああ、そうです!私の間違い。ちょうど今知りました。 – Kartic

答えて

1

getRate()(SingerPlayerの場合)は、SingerのgetRate()を上書きします。そして、SingerPlayerはgetRate(),sing()およびplay()を継承しています。

+0

EmployeeはどのsetRateメソッドを継承しますか? – Tumelo

+0

クラスはボディを提供する必要があります。そして、両方のインターフェースでsetRateが同じであるため、従業員はvoid setRate(倍精度)のみを実装する必要があります。 – Shiro

関連する問題