Javaインタフェースの適切な使用

ジョナサンDeLorenzo:

私はもともとしかし、私が同じメソッドを持つように両方のクラスを望んで実現し、二つのクラス間で共有されるすべてのメソッドを含むインターフェイスを作成したが、彼らは異なる動作をしようとしています。

彼らは、同じ戻り値の型が、異なるパラメータを持つことになります。私はこれを実装する方法を見つけ出すことができない、または私はこれを実装する方法を見つけ出すをしなかった場合でも、それは状況を処理するための適切な方法であろうと、私は知りません

基本的に、私はここに私が達成しようとしているものを私に正しいアーキテクチャのアプローチを探して来ていると私はそれがどうなるか分かりません。私は、コードのアーキテクチャを決定するための4つの疑問を持っていると思います:

  1. 正しいアプローチインターフェースなぜならば、ここですか?
  2. 抽象クラスは、なぜならば、ここでは正しいアプローチですか?
  3. 私は特定のクラス与えられた異なる動作をするためにどのような機能にあなたを持つ意味ということで、それは、OOPでの共通のテーマになるようにこれがそうです。コードはどのように設計すべき?
  4. 最後に、私の最初に考えたのは、「ああ、私はクラスのいずれかのメソッドをオーバーライドします」、それは私に大きな頭痛の種を与えていると機能していませんでした。私は、メソッドをオーバーライドしようとしたとき、私はこの問題があることはありませんように感じます。より複雑なインターフェースからのメソッドをオーバーライドしていますか?

public interface Character {
    public void setAttack();
}

/*the setAttack method here will be set by the programmer. The 3 values 
 passed by the programmer are then stored into an array*/
public class Player implements Character {
  public void setAttack(int x, int y, int z) {

    attackArray[0] = x;
    attackArray[1] = y;
    attackArray[2] = z;
  }
}

/*the setAttack will still serve the same purpose as the setAttack in the 
 player class, however, the values will be auto generated randomly once the 
 setAttack function is called for the NPC instance.*/

/*Another thought I had is passing the function that auto generates the 3 
integer values (numGen()) as a parameter 3 times, however, I'm not sure if 
this is possible. Just a thought*/


public class NPC implements Character {
  public void setAttack(){

      for(int i = 0; i < attackArray.length; i++)
    {
        attackArray[i] = numGen();
    }
  }
}
GhostCat敬礼モニカC.:

概念的な誤解があります:持つ同じ方法がより同じ持つメソッドの実装よりも意味の名前を

あなたはJavaで多型とインタフェースを使用する場合は、あなたが意思表明しています。以下のように:いくつかのインタフェースを実装するクラスに対応する「機能性」を提供しなければなりません。言い換えれば、これは、特定の動作を説明します。

事はある:インタフェースがある場合foo()、および異なるクラスが必要かもしれませんfoo(X)し、foo(Y)その後、本当の問題は、次のとおりです。これらのメソッドは、より多くの名前だけよりも共通しているのか?

その場合、一つの可能​​な解決策は、抽象化の別の層になります。あなたのケースでは、のように:

public interface AttackParameters {
...


public interface Character {  
  public void setAttack(AttackParameters parms);

似てか何か。アイデアは再び一般的な解決策と「特定」の詳細を交換することです。

また、あなたが使用することができMap<String, Object>、あなたのための引数setAttack()の方法を。言い換えれば:攻撃のパラメータは文字列で識別されます。

それは素晴らしく、ダイナミックですが、まあ、それはまた、コンパイル時の安全性を回避し。マップのアプローチのわずかに良いバージョンはキーとして文字列を使用しますが、いくつかのではないでしょう列挙型クラス。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=197193&siteId=1