2016-04-19 18 views
1

私はコードの実装でJavaインターフェイスを使用する必要がある簡単な電卓の割り当てに取り組んでいます。次のように私は、インターフェイスを設定している:Javaを使用してインターフェイスを実装しようとすると非静的メソッドを呼び出す

public interface OperationInterface { 

    // create symbolic constants to define operation options 
    static final int ADDITION = 1; 
    static final int SUBTRACTION = 2; 
    static final int MULTIPLICATION = 3; 
    static final int DIVISION = 4; 

    // return answer to requested calculation as a string 
    public String toString(int argumentOne, int argumentTwo); 
} 
次のように私はその後、私の「追加」クラスを持っている

public class Add implements OperationInterface { 
    // override toString method by returning answer to calculation as a string 
    public String toString(int argumentOne, int argumentTwo) 
    { 
     return "" + (argumentOne + argumentTwo); 
    } 
} 

が、私はその後、私のクライアントからこのAdd.toString()メソッドをコールしようとしています

mOut.print(Add.toString(argumentOne, argumentTwo)); 

ここで、mOutはActivityInterfaceです。私の現在の問題は、toStringはAndroidスタジオで赤文字の下線が引かれていることです。 '非静的メソッドtoString(int、int)は静的コンテキストから参照できません。私がtoStringメソッドを静的にすると、Addクラスで別のエラーが発生します。私のアプローチは間違っていると思いますので、いくつかのガイダンスに感謝します。

また、static final intを使用して、どのクラスを呼び出すかを決定したいと思います。 if(operation == ADDITION)、次にAdd.toString(int、int)などをSubtract、Multiply、Divideクラスで呼び出します。私は現時点でそれを行う方法を見ることができませんので、再びすべての指導を感謝します。おかげ

+1

他のエラーは何ですか?キーワード 'static'の意味を調べたいと思うかもしれません。 – SomeJavaGuy

答えて

4

はあなたのインターフェイスは、インスタンス固有の動作を定義していますが、それは静的メソッドであるかのようにAdd.toString呼び出すようにしようとしています。それはインスタンスメソッドではありません。

インスタンスメソッドを使用するには、インスタンスを持っている必要があります。

Add a = new Add(); 
mOut.print(a.toString(argumentOne, argumentTwo)); 

operation変数に基づいて使用する操作が選んについては、私はおそらくswitchを使用したい:

switch (operation) { 
    case ADDITION: 
     // ... 
     break; 
    case SUBTRACTION: 
     // ... 
     break; 
    //...and so on... 
} 

覚えているのはdefaultです。

生産コードで使用される可能性がある(または使用されない)可能性があるのはMap<Integer,OperationInterface>ですが、switchはおそらく宿題で最も単純で最も単純なものです。

ビーイング(それはあなたに害、学習機会を否定するだろうと)が実際にここで宿題をしないように、しかし、あなたはおそらくswitchにインスタンスを作成し使用しますが、ないと思います、本当に慎重にtoStringへの実際の呼び出しを行います。例えば、コードは、

  • switchした後、それを適切なインスタンスを割り当てることがない初期値
  • 使用switchで変数を宣言し非常にラフな用語

    • であること
    それにtoStringを呼ぶだろう

    これは、変数がタイプOperationInterfaceでなければならず、Add(またはSubtractなど)ではないことを意味します。これは、おそらく運動のポイントの大きな部分です。


    サイドノート:むしろ文字列にintを変換するために、空の文字列と連結するよりも、例えば

    return "" + (argumentOne + argumentTwo); 
    

    String.valueOf(int)、例えばを考える:

    return String.valueOf(argumentOne + argumentTwo); 
    
  • +0

    それは優れているし、文字列部分もありがとう。どのように変数 '演算'(1と4の間の値)を使用して、関連するクラスAdd、Subtract、MultiplyまたはDivideを直接呼び出すのですか?この最後の部分にif/else文を使用しないでください。 –

    +0

    @SteveW:私はそれをカバーする答えを広げました。あまりにも多くを与えることなく、それがあなたに十分に働くことを望む。私は実際に仕事をしないで慎重にしようとしていますが、誘惑するのは完全な例を示すだけなので、それはあなたにとって不利になります。 –

    +0

    もう一度ありがとうございます。私はスイッチを認識しています - if/else imoを行う別の方法。しかし、あなたの他の手がかりは私の考えが働いているので、私は良い方法を見ていると思う。 –

    0

    あなた「のtoString」方法は静的ではないので、それが存在するクラスのオブジェクトを作成しなくても呼び出すことはできません。

    "toString"メソッドが静的メソッドであった場合、静的メソッドがオブジェクトではなくクラスに属しているため、コードが機能します。直接クラス名で呼び出すことができます。静的な方法で静的でないメソッドにアクセスしようとしているため、「静的メソッドtoString(int、int)は静的コンテキストから参照できません」という理由があります。

    クラスのオブジェクトを作成し、そこから必要なメソッドを呼び出します。

    関連する問題