-1

Java 8 では、インターフェイスで Static および Default メソッドを使用して、以下のような単純なフレームワークで本格的な継承が可能になっているようです。

誤用したり愚かなコードを書いたりする可能性は常にありますが、これらの新機能により、言語の設計者がそれを避けるつもりであったとしても、多重継承を非常に簡単に実現できます。

これはインターフェイスを基本クラスとして使用する多重継承の単純な実装ですか、それとも言語の誤用ですか? Java 設計者はこれを許可するのに行き過ぎたのでしょうか?

package PseudoMultipleInheritance;
import java.util.HashMap;

abstract class InstanceMap<T,T2>
{ 
     HashMap<Object,Object> instances = new HashMap<Object, Object>();
     abstract T2 createMembersInstance();
     T2 getMembersInstance(T thisObject )
     {
         if ( !instances.containsKey(thisObject) )
             instances.put(thisObject,createMembersInstance());
         return (T2) instances.get(thisObject);      
     }  
}

interface A  
{
 class Members
 {
    int x;  // just an example of an inheritable member 
 }
 InstanceMap<A,A.Members> instanceMap = new InstanceMap<A, A.Members>() {   A.Members createMembersInstance() {return new A.Members();  }};
 default A.Members thisA() { return instanceMap.getMembersInstance(this); }
 default int getX()
 {
     return thisA().x;  // // just an example of an inheritable getter
 }
 default void setX(int x)
 {
     thisA().x = x;  // just an example of an inheritable setter
 }
}

interface B 
{
 class Members
 {
    int y;  // just an example of an inheritable member
 }  
 InstanceMap<B,B.Members> instanceMap = new InstanceMap<B, B.Members>() {   B.Members createMembersInstance() {return new B.Members();} };  
 default B.Members thisB() { return instanceMap.getMembersInstance(this); }
 default int getYLastDigit()
 {
     return thisB().y % 10;  // just an example of an inheritable function
 }
 default void incrementY(int x)
 {
     thisB().y += x; // just an example of an inheritable function
 }
}

class C implements A, B
{
}

public class Example04AlmostMultipleInheritance {

 public static void main(String[] args) {
     C c1 = new C();
     C c2 = new C();
     c1.setX(5);
     c2.setX(3);
     System.out.println(c1.getX());   // prints 5
     System.out.println(c2.getX());   // prints 3
     c1.incrementY(99);
     System.out.println(c1.getYLastDigit());  // prints 9 

}
}

/////////////////////////////////////////////// /

またはさらに別のオプションの場合:

interface A  
{
 class Members
 {
    public int x;  // just an example of an inheritable member
    void showX() { System.out.println(x); }  // just an example of an inheritable function
 }
 InstanceMap<A,A.Members> instanceMap = new InstanceMap<A, A.Members>() {   A.Members createMembersInstance() {return new A.Members();  }};
 default A.Members getA() { return instanceMap.getMembersInstance(this); }
}

interface B 
{
 class Members
 {
    int y;  // just an example of an inheritable member
 }  
 InstanceMap<B,B.Members> instanceMap = new InstanceMap<B, B.Members>() {   B.Members createMembersInstance() {return new B.Members();} };  
 default B.Members getB() { return instanceMap.getMembersInstance(this); }
}

class C implements A, B
{
}

public class Example04AlmostMultipleInheritance {

 public static void main(String[] args) {
     C c1 = new C();
     C c2 = new C();
     c1.getA().x = 5;
     c2.getA().x = 3;
     c1.getA().showX();   // prints 5
     c2.getA().showX();   // prints 3
     c1.getB().y = 99;
     System.out.println(c1.getB().y % 10);  // prints 9 

}
}
4

3 に答える 3

1

インターフェイスの実装は継承ではありません。それはそれと同じくらい簡単です。

誰かがあなたの両方のインターフェースを実装していて、デフォルトのものとは異なる実装を提供した場合はどうなるでしょうか?

いいえ、これは多重継承ではありません。デフォルトメソッドの独自のバージョンを実際に実装する人がいないことに依存するコードを書く方法にすぎません。つまり、デフォルトの代わりに独自のメソッドを実装できるはずなので、実際には想定どおりにインターフェイスを使用していない人々に依存していることを意味しますが、実際にそうすると、「多重継承」は機能しません予想通り。

したがって、これは実際には言語の誤用であると考えています。

于 2014-10-08T23:17:17.720 に答える
0

いいえ、ここで多重継承の例を参照してください: http://java.dzone.com/articles/interface-default-methods-java

于 2014-10-09T00:44:59.290 に答える