2016-05-10 8 views
0
public abstract class Agent1 { 
    public abstract void actOn(Object o); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o); 
     } 
    } 
} 

public abstract class Agent2 { 
    public abstract void actOn(Object o, int i); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o, j); 
     } 
    } 
} 

このコードは、コードの重複を減らすことによってどのように改善できますか? 答えはこう述べています。コード重複継承

エージェント1は、エージェント2から継承しなければなりませんし、エージェント1は、アクトン(O)を使用して、アクトンを(O、I)を実行し、またリピート機能を削除します.....

「エージェント2は、エージェント1から継承しなければなりません、とエージェント2はアクトン(O、i)を用いアクトン(O)を実行し、また、削除させていただきます

:しかし、私の意見では、以下の答えが正しく見えるが、その間違っている、なぜリピート機能 "

EDIT:BOLD エージェント2

+1

この種の質問はhttp://codereview.stackexchange.com/で尋ねるべきです。 – Jens

+0

あなたの質問は不明です。 「間違っていると言ってどういう意味ですか? –

+1

(私は理解してもいいかもしれないと思うけど、最初は明確にされていると本当に問題になるかもしれません) –

答えて

0

最初のオプション:

エージェント1は、エージェント2から継承しなければなりませんし、エージェント1はアクトンアクトン(O)を使用して、(O、I) を実行します、リピート機能を削除することもできます。

可能な実装:

public abstract class Agent1 extends Agent2{ 
    public void actOn(Object o, int i){ 
     // do something with i 
     actOn(o); 
    } 
    public abstract void actOn(Object o); 
} 

public abstract class Agent2 { 
    public abstract void actOn(Object o, int i); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o, j); 
     } 
    } 
} 

番目のオプション:

"エージェント2は、エージェント1から継承しなければなりませんし、エージェント1は、アクトン(O、i)を用いアクトン(O) を実行し、またリピート機能を削除します"

actOn(o)を実行すると、エージェント1はactOn(o,i)を使用できません。これは、エージェント2 extendsの場合はエージェント1、次にエージェント2はエージェント1(継承者ではない)を継承するためです。 e actOn(o,i)はAgent1には使用できません。

2番目のオプションが間違っています。最初のものは正しいです。

番目のオプションEDIT

「エージェント2は、エージェント1から継承しなければなりません、とエージェント2はアクトン(O、i)を用いアクトン(O) を実行し、またリピート機能を削除します「

実装の試み:

public abstract class Agent2 extends Agent1{ 
    public void actOn(Object o){ 

     actOn(o, i); // what is i ??? 
    } 
    public abstract void actOn(Object o, int i); 
} 

public abstract class Agent1 { 
    public abstract void actOn(Object o); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o); 
     } 
    } 
} 

最初にiを宣言して初期化しない限り、をactOn(o)からAgent2クラス内に呼び出すことはできません。エクササイズで余分な変数を作成するための制限が設定されていない場合、2番目の答えに間違いはありません。

+0

私の質問はなぜ2番目のオプションが間違っているのですか? – student

+0

さて、あなたはまた、コードが改善される方法を尋ねていました:) –

+0

@アンジェロオパラ:私が提供したこの答えは、私の質問はなぜ2番目のオプションが間違っているのですか? – student