1

という名前のアルゴリズムの基本クラスがありますDEa()、 、 の2 つのメソッドが実装されていますb()。という名前のこのアルゴリズムのバリエーションをテストしたいと思いDEaます。だから、私はやっていてDEa extends DE、メソッドをオーバーライドしていますa()。別のバリエーション、アルゴリズムがありますDEb。私は同じことをして、DEb extends DEオーバーライドしていますb()。今、アルゴリズムをテストしたいと思いますDEab。これが問題です。私が書いDEab extends DEaた場合、オーバーライドされた method が既にありますが、 ではa()ありません。からb()コピーする必要があります。b()DEb

コード例:

class DE { int i; void a() { i = 1; } void b() { i++; } };
class DEa extends DE { void a() { i = 2; } };
class DEb extends DE { void b() { i--; } };
// class DEab extends DEa, DEb - can't write like this
class DEab extends DEa { void b() { i-- }; } // but this is copy-paste :c

、 、、、 ... で試してみましたがinterface A、基本的に同じ問題です。interface BDE implements A, BDEa extends DEDEb extends DE

interface A { void a(); } // methods in interfaces must be abstract
interface B { void b(); } 
class DE implements A, B { int i; void a() { i = 1; } void b() { i++; } };
class DEa extends DE { void a() { i = 2; } };
class DEb extends DE { void b() { i--; } }; 
class DEab extends // ... well it give me nothing

コピペせずにどうやってやるの?

4

3 に答える 3

3

このパターンを使用できます。

public interface A {
    public void a();
}

public interface B {
    public void b();
}

public class ABComposition implements A, B {    
    private A a;
    private B b;

    public ABComposition(A a, B b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void a() {
        a.a();      
    }

    @Override
    public void b() {
        b.b();
    }
}
于 2013-06-15T08:17:22.490 に答える
2

Java には多重継承はありません。複数のインターフェースを実装する (実装を提供する) ことはできますが、(直接の) スーパークラスは 1 つだけです。

作成することで、とにかくコンポジションを使用できます

 public class DEab extends DE {
   private DEa dea = new DEa();
   private DEb deb = new DEb();
   public int a() {
     return dea.a();
   }

   public int b() {
     return deb.b();
   }
 }

クラスのロジックがサポートしている場合。

更新:質問の更新後、私はより単純な「いいえ、Javaは多重継承をサポートしていません」に固執します

于 2013-06-15T08:17:30.910 に答える