5

インターフェイスの実装を含むプログラミング クラスに参加するための宿題に取り組んでいます。ここでの問題は、私がインターフェイスやその使用目的を完全に理解していないことです(教授はそれを説明するのがあまり得意ではありませんでした)。

割り当てられたのは、「乗り物」のスーパークラスを作成することでした。3 つのサブクラスよりも、「トラック」や「ジープ」のような、それぞれ独自の特性を持つものを作成することでした。「Vehicle」クラスは、私が理解したと思われる同等のインターフェースを実装する必要があり(compareTo()車両のドアの数を比較する方法が書かれています)、他の1つのクラスも「Hybrid」クラスを実装する必要があります(わかりませんこれが何を意味するか)。toString()次に、、、equals(Object o)およびcompareTo(Object o)メソッドを実装する必要があります。

私はcompareTo()ダウンを持っていると思いますが、equals()私にはわかりません。最後に行う必要があるのは、テストする Main を作成することです。これには、Vehicle オブジェクトの配列を作成し、それらを出力し、並べ替えてから再出力する必要があります。また、配列を反復処理してハイブリッド車のプレミアム価格を出力し、equals(Object o)メソッドを使用して 2 台の車両を比較する必要があります。

これが私の「車両」スーパークラスのコードです

package vehicle;

abstract public class Vehicle implements Comparable {
    private String color;
    private int numberOfDoors;

    // Constructor
    /**
     * Creates a vehicle with a color and number of doors
     * @param aColor The color of the vehicle
     * @param aNumberOfDoors The number of doors
     */
    public Vehicle(String aColor, int aNumberOfDoors) {
        this.color = aColor;
        this.numberOfDoors = aNumberOfDoors;
    }

    // Getters
    /**
     * Gets the color of the vehicle
     * @return The color of the vehicle
     */
    public String getColor() {return(this.color);}
    /**
     * Gets the number of doors the vehicle has
     * @return The number of doors the vehicle has
     */
    public int getNumberOfDoors() {return(this.numberOfDoors);}

    // Setters
    /**
     * Sets the color of the vehicle
     * @param colorSet The color of the vehicle
     */
    public void setColor(String colorSet) {this.color = colorSet;}
    /**
     * Sets the number of doors for the vehicle
     * @param numberOfDoorsSet The number of doors to be set to the vehicle
     */
    public void setNumberOfDoors(int numberOfDoorsSet) {this.numberOfDoors = numberOfDoorsSet;}

    @Override
    public int compareTo(Object o) {
        if (o instanceof Vehicle) {
            Vehicle v = (Vehicle)o;
            return this.numberOfDoors - v.getNumberOfDoors();
        }
        else {
            return 0;
        }
    }

    /**
     * Returns a short string describing the vehicle
     * @return a description of the vehicle
     */
    @Override
    public String toString() {
        String answer = "The car's color is "+this.color
                +". The number of doors is"+this.numberOfDoors;
        return answer;
    }
}

また、サブクラスの1つを投稿します

package vehicle;

abstract public class Convertible extends Vehicle {
    private int topSpeed;

    // Constructor
    /**
     * Creates a convertible with a color, number of doors, and top speed
     * @param aColor The color of the convertible
     * @param aNumberOfDoors The number of doors of the convertible
     * @param aTopSpeed The top speed of the convertible
     */
    public Convertible (String aColor, int aNumberOfDoors, int aTopSpeed) {
        super(aColor, aNumberOfDoors);
        this.topSpeed = aTopSpeed;
    }

    // Getters
    /**
     * Gets the top speed of the convertible
     * @return The top speed of the convertible
     */
    public int getTopSpeed() {return(this.topSpeed);}

    // Setters
    /**
     * Sets the top speed of the convertible
     * @param topSpeedSet The top speed to set to the convertible
     */
    public void setTopSpeed(int topSpeedSet) {this.topSpeed = topSpeedSet;}

    /**
     * Returns a short description of the convertible
     * @return a short description of the convertible
     */
    @Override
    public String toString() {
        String answer = "The car's color is "+super.getColor()
                +", the number of doors is "+super.getNumberOfDoors()
                +", and the top speed is "+this.topSpeed+" mph.";
        return answer;
    }
}

私は間違いなく誰かに私のために仕事をするように頼んでいませんが、誰かがインターフェイスがどのように機能するか、そしてこの宿題が本当に求めていることをもう少し明らかにすることができれば、それは素晴らしいことです.

すべての助けは非常に高く評価されています

ありがとう!

4

4 に答える 4

12

特定の例を実行するのではなく、インターフェイスが役立つ理由と、より一般的なケースでそれらを使用する方法について説明します。

インターフェイスとは

私が最初にプログラミングを始めたとき、インターフェイスの概念がわかりにくいと感じたので、それを標準の「ルールブック」と考えるのが好きです。このルールブックを実装するすべてのクラスには、従わなければならない「ルール」のリストがあります。たとえば、次のインターフェイスを考えてみましょう。

interface Bounceable{
  public void setBounce(int bounce);
  public int getBounce();
}

上記のルール ブックでは、バウンスするもののインターフェイスを宣言しています。バウンス可能なものはすべて、バウンスを設定し、バウンスも取得する必要があると述べています。このインターフェースを実装するクラスは、ルールブックに従う必要があります。

このルールブックが役立つのはなぜですか?

では、子供たちがあらゆる種類の弾力のあるもので遊ぶ遊び場をコーディングしたい場合はどうでしょうか。次のような弾むようなものを作ることができます。

public class FootBall implements Bounceable{
private int bounce;

public void setBounce(int bounce){
   this.bounce = bounce;
}

public int getBounce(){
  return this.bounce;
}

}

public class BaseBall implements Bounceable{
private int bounce;

public void setBounce(int bounce){
   this.bounce = bounce;
}

public int getBounce(){
  return this.bounce;
}

}

上記のクラスは、弾むボールのタイプを定義します。次に、playground クラスを作成し、抽象的な Bounceable インターフェイスの周りにメソッドを定義できます。たとえば、バスケットボールのフープがクラスのメソッドだったらどうしますか? 弾むようなものを引数として受け入れることができたらどうでしょうか? これは、跳ね返りを実装している限り、どんな種類のボールでもパスできることを意味します。インターフェイスや同様の機能がなければ、実装するボールが増えれば増えるほどコードが乱雑になることがわかります。

編集:小さな実用的な例を含めました..

これの実際の例は..

public void slamDunk(Bounceable bouncyThing){
  System.out.println("You scored three points!");
}

次の slamDunk への呼び出しはどちらも有効です...

slamDunk(new BaseBall());

slamDunk(new FootBall());

これで、slameDunk関数はバウンス可能なオブジェクトでポイントを獲得できます。

于 2012-04-16T18:07:49.297 に答える
0

Comparable インターフェースは、ドキュメント http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html で説明されており、次の署名があります。

int compareTo(T o)
Compares this object with the specified object for order. 
Returns a negative integer, zero, or a positive integer as this object is less than, 
equal to, or greater than the specified object. 

あなたが書く場合:

public class Vehicle implements Comparable {
//...
}

それをコンパイルしようとすると、エラーが発生します。インターフェイスには、メソッドが必要ですcompareTo()。それを書く必要があり、整数値を返さなければなりません。これは、ビークルが別のビークルよりも「大きい」、「小さい」、または等しいかどうかに応じて、正、負、またはゼロになります。「より大きい」が何を意味するかを決めるのはあなたです - それは質量、年齢、価値など何でもかまいません。それがインターフェースの価値です。それは何をしなければならないかを示していますが、どのようにそれをしなければならないかは示していません。

これは自分でやりたいので、Comparable のチュートリアルに従うことをお勧めします。

于 2012-04-16T18:09:09.297 に答える
0

他の人が言ったように、インターフェイスはクラスの契約のようなものです。クラスがインターフェイスを実装すると、特定の方法で動作すると主張されます (たとえば、クラスが を実装Comparableすると、他のオブジェクトと比較可能であると主張され、compareToメソッドを実装することでこの契約が満たされます)。

あなたの問題はインターフェースにあるのではないようです - あなたはすでに実装していますComparable。ただし、チェックする必要がありnullますcompareTo

について質問しequals(Object o)ます。これはさらに簡単です。比較対象のオブジェクトがこのオブジェクトと同じ場合と、そうでない場合compareTo(Object o)に戻る必要があります。(注意して、チェックすることを忘れないでください--場合はfalseを返す必要があります)。truefalsenullonull

また、あなたは について尋ねますが、あなたはすでにあなたのコードにtoString()実装しています。toString()唯一のコメントは、特定のサブクラスtoString()がおそらくそれについて何か特別なことを言及する必要があるということです(たとえば、それはコンバーチブルまたはハイブリッドなどです...)

于 2012-04-16T18:17:12.703 に答える
0

(以下のシナリオでは、すべての名詞をプログラム内のクラス (ある時間プロパティ) と考え、すべての動詞をクラスのメソッドと考えます)

あなたはロボットを作っています。ロボット 1 で以下のことを行いました。2 つのアイ センサー、2 つの手、2 つの脚、および頭 (ロボットの高さ = 2m) 2. このロボットと通信するために、頭から 10 本のワイヤ、脚から 10 本のワイヤ、および 13 本のワイヤを取り出しました。手からワイヤー。

ロジックは、頭のワイヤ番号 1 が脚のワイヤ番号 2 に参加すると、ロボットが歩くというものです。手のワイヤー 9 が頭のワイヤー 4 とつながり、頭のワイヤー 1 が手のワイヤー 6 とつながると、両手が上がります。IMP 注 - 頭のワイヤ 3 は、脚のワイヤ 5 に触れないようにしてください。そうでなければ、すべてが吹き飛ばされます。

なんとINTERFACEか!

そして、これがロボットを初めて見た人に与えられなければならないと想像してみてください。このロボットがどのように使われるかを考えてみましょう。


同様に、クラスを作成するときは、それが他のプログラムでどのように使用されるかを考慮する必要があります。パブリック フィールド (int および string) を他のプログラムで使用できるようにしたいですか、それとも複雑な整数ロジックを処理する単純な関数が必要ですか。

インターフェイスは、2 つのクラス間で通信するための簡単な方法を提供します。その間、クラスの他のものがどうなるかを心配する必要はありません。

于 2012-04-17T07:08:32.943 に答える