2016-07-24 24 views
-1

を上書きせずに私は現在、Javaで2つのクラスを設計していますし、相続の私の現在の問題を理解した上で、いくつかの問題を抱えていますので、私はそれを期待して、簡単なコード例を作成しました誰かが私が何が起こっているのか理解するのを助けることができるは、子クラスの変数で親クラスのメソッドを使用して

この例では、親クラス(一般的にはCarクラス)と子クラス(クラスRedCar)があります。親クラスは抽象であり、属性距離を含み、入力引数時間(double)をとり、距離を時間で割った二倍の値(つまり速度を与える)を返すcomputeVelocityのメソッドを含んでいます。

子クラスには、RedCar(double inputDistance)というコンストラクターがあります。また、computeVelocityメソッドにもアクセスし、オーバーライドする必要はありません。

ここに問題があります。論理的には、computeVelocityは、RedCarからinputDistance変数を取るべきではないことを理解しています。なぜなら、それは別のクラスのメソッドを呼び出すためです。しかし、私が知りたいことは、そのメソッドをRedCarクラスに持っていかれ、そのクラス内で引数をコンストラクタに渡して使用できることです。ここで

あなたにコメントの一部で述べたように、コード

//Car Class 
public abstract class Car{ 
    //abstract variable 
    private double distance; 
    //compute velocity method 
    public double computeVelocity(double time){ 
    return distance/time; 
    } 
} 




//RedCar Class 
public class RedCar extends Car{ 
    public double distance; 

    public RedCar (double inputDistance){ 
     this.distance = inputDistance; 
    } 
    //This is currently my method but I believe this already constitutes as overridding 
    public double computeVelocity(double hours){ 
     Car.super.computeVelocity(hours); 
    } 
} 
+0

それはあなたがここで何をしようとして私には本当にはっきりしない、または、なぜこの方法がまったく上書きする必要があります。オーバーライドは何も追加しないので、なぜそれを持っているのですか?なぜ、基本クラスの '' computeVelocity'メソッドを使うのではないのですか? – David

+1

サブクラスに2番目の距離フィールドを設定しないでください。ところで、基本クラスの距離フィールドは常に0です。基本クラスの距離を引数として保護されたコンストラクタを作成し、サブクラスのコンストラクタから(super(distance)を使用して)それを呼び出します。 –

答えて

0

の一例である答え、あなたが本当に必要としないし、二回(一回親クラスの距離を持つべきではないと子供クラスで1回)。親クラスのdistanceパラメータを使用すると、メソッドをオーバーライドする必要はありません。 superキーワードを使用して、親クラスのメソッドを呼び出すことができます。

これが役に立ちます。

0

プライベートインスタンス変数をサブクラスに継承されますが、サブクラスではアクセスできませんされているので(あなたがそれにアクセスするためにリフレクションを使用することができます)。パブリックセッターまたはゲッターメソッドを提供するか、保護されたコンストラクターまたはパブリックコンストラクターを提供し、サブクラスからそのコンストラクターを呼び出すことによって、Carインスタンス変数private double distanceの値を提供する2つの方法があります。そこに自分のメンバーによってのみアクセスプライベートメンバは、独自のメソッドとコンストラクタによって意味するので

は、リンクにプライベート距離変数に値を設定し、スーパークラスの Do subclasses inherit private fields?継承プライベートフィールド

コンストラクタを参照してください。

protected Car(double distance){ 
    this.distance = distance; 
    } 

そしてまた、あなたは(サブクラスの)あなたの方法のcomputeVelocityでそれを使用していないので、サブクラスで再び距離変数を定義する必要がありません。サブクラスメソッドはスーパークラスメソッドを呼び出すため、スーパークラスメソッドは独自のプライベートダブル距離を使用します。したがって、距離変数はスーパークラスメソッドで使用されていないサブクラスで定義されます。

スーパークラスのprotectedコンストラクタを提供した後、あなたはスーパークラスのコンストラクタを呼び出すスーパーkeyword.Theは、superキーワード使用して、サブクラスのコンストラクタから呼び出すことができます。スーパークラスのコンストラクタを提供するので、スーパークラスのデフォルトのコンストラクタをjavaに追加しないでください。超スーパークラスのメソッドを呼び出すための変数

 public RedCar(double inputDistance) { 
    super(inputDistance); 

     } 

と正しい方法は、不要車ではありませんプライベートダブル距離に値を割り当てる使用して、サブクラスからそのコンストラクタを呼び出します。スーパー

public double computeVelocity(double hours) { 
     return super.computeVelocity(hours); 
    } 
0

あなたのクラスRedCar継承クラスCar。したがってCarは単なる別のクラスではありません。 RedCarインスタンスを作成する場合は、Carのすべての部分も使用できます。 RedCarは、Carである。

解決策では、スーパークラスとサブクラスの両方にフィー​​ルドdistanceが作成されています。実際には、各RedCarインスタンスにdistanceという名前の2つのフィールドがあります。

ここでは、可視性が考慮されています。プライベート変数distanceRedCarの一部ですが、それはクラスCarにのみ表示されます。 Carに定義されたメソッドのみがdistanceにアクセスする必要がある場合は、可視性を変更する必要はありません。しかし、distanceを設定する方法が必要です。値が時間の経過とともに変化しない場合は、クラスCarにコンストラクタを含める必要があります。

方法computeVelocity()の可視性はCarで定義されているので、サブクラスで繰り返す必要はありません。 RedCarCarなので、RedCarインスタンスごとにcomputeVelocity()と呼び出すことができます。 RedCarコンストラクタが呼ばれ

RedCar redCar = new RedCar(100.0); 

まず100.0distanceフィールドを設定Carコンストラクタを呼び出します。

public abstract class Car{ 
    private double distance; 

    // Constructor with visibility protected. 
    // So it is visible in each subclass and must be 
    // called by each subclass constructor. 
    // Btw.: It is common practice to use the same name 
    // for input parameters as for fields. The field 
    // variable can be accessed with the "this" keyword. 
    protected Car(double distance) { 
    this.distance = distance; 
    } 

    //compute velocity method 
    public double computeVelocity(double time){ 
    return distance/time; 
    } 
} 


public class RedCar extends Car{ 
    public double distance; 

    public RedCar (double distance){ 
    // Call the Car constructor 
    super(distance) 
    } 

    // No need to repeat the definition of 
    // computeVelocity unless you want to redefine 
    // the behaviour.. 
} 

は、その後、あなたはRedCarインスタンスを作成するとき。

あなたは、メソッドを呼び出すことができます。

double velocity = redCar.computeVelocity(60.0); 
関連する問題