2017-07-21 14 views
-2

私はかなり新しいJavaであり、継承を使用するプロジェクトに取り組んでいます。現在、3つの異なるクラスがあります - 上位レベルCarクラス、中レベルCarPartクラス、および下位レベルEngineクラスは、CarPartクラスを継承します。私はEngineクラスが単にコンポーネントの動作/状態を表すことを望みます。私は、CarPartクラスを汎用的にして、複数の異なるパーツを扱うようにしたい(今はエンジンをセットアップしただけです)。今では、カーパーツを表すすべてのクラス(エンジンなど)は、「CarPart」というスーパークラスから継承したいと考えています。 CarPartクラスには、すべてのタイプの自動車部品(状態や診断レポートを印刷する機能など)で共有されるすべての状態と動作があります。以下はJavaで継承を使用するクラス

私は一部は以下

public class Car { 
    Engine engine; 

    public Car() { 
    engine = new Engine(); 
    } 

    public void run() { 
    this.engine.printStatus(); 
    } 
} 

オブジェクトを作成できるようにしたい私の車のクラスは私のCarPartクラスは、私は車の部品のいずれかのタイプに汎用的になりたいと今の私はちょうど欲しいものですパーツの状態を印刷します。以下は

public class CarPart { 
    private Object object; 

    public String printState(Object object) { 
    System.out.println("The status is "+object.getState()); 
    } 

} 

私のエンジンクラスのコードです:

public class Engine extends CarPart{ 
    private String state; 

    public String getState() { 
    if(!state.equals(null)) { 
     System.out.println("The engine is "+state); 
    } else { 
     this.state = "off"; 
     System.out.println("The engine is off"); 
    } 
    return state; 
    } 

    public void setState(String engineState) { 
    this.state = engineState; 
    } 
} 

は、私はこの問題はダウンキャストと子クラスのメソッドへのアクセスを持っていない親クラスに関係していると思います - しかし、私はよステータスレポートを正しい方法で印刷する方法については不明です。どんなアドバイスも大歓迎です!あなたはObject参照の上Engineの方法を使用し、第4行で

public class CarPart { 
    private Object object; 
    public String printState(Object object) { 
     System.out.println("The status is "+object.getState()); 
    } 
} 

:あなたのエラーメッセージ以来

+0

'public String printState(Object object)' ANYオブジェクト(String、Integer、ArrayList、John3136sSuperDuperSwissArmyKnifeClassOfPain)の状態を出力できますか? – John3136

+0

@ John3136申し訳ありません、それを忘れました。いいえ、CarPartからオブジェクトの状態を出力する方法がわかりません。 "getState()はObject型のために未定義です"というエラーが表示されます。 – kdubs

+0

CarPartとEngineにはコンストラクタが必要です。 –

答えて

0

CarPart

CarPartさんprintState(Object object) { "にアップ" 移動getState()EngineのうちsetState()stateメンバーは次のようになります。あなたは更に多くの私たちに十分な情報を与えられていない

public void printState() 
{ 
    System.out.println(this.state); 
} 

。たとえば、サブクラスに煩わされることなく、それぞれの名前に名前を付けることができます。 Engineのようなサブクラスは、データや機能を追加する場合にのみ意味があります。例えばEngineには、おそらく出力、おそらく燃料タイプの数のシリンダがあります。 WindscreenWiperにはこれらのプロパティはありません。

また、printStateは、おそらくあなたが望むものではないことに注意してください。通常はCarにはCarPartが含まれ、それぞれgetState()と表示され、Carで印刷の仕方を設定できます。

+0

次のステップは、そのような特定の情報をサブクラスに追加することでした。そのように、私はそのように設定しました。私は最初に働いた裸の骨のバージョンを取得しようとしていた。 – kdubs

+0

質問に答えることができない場合は、何がうまくいかないか、何をしようとしているのかを具体的に説明する必要があります。 – John3136

-1

は、それが理由のだ、「getStateを()はObject型のために定義されていません」です。 Objectクラスにはそのメソッドがないため無効です。 System.out.println("The status is "+((Engine)object).getState());としてキャストすることもできます(ただし、オブジェクトがEngineでない場合は1つの例外が発生する可能性があります)。またはクラスを変更します。

public class Car { 
    private Engine engine; 
    public void run() { 
     System.out.println(engine.getState()); 
    } 
} 
public abstract class CarPart { 
    public String getState(); 
} 
public class Engine extends CarPart { 
    private String state; 
    public String getState(){ 
     if(state== null) state= "off"; 
     return state; 
    } 
} 
+0

投票の理由を知ってうれしいので、コーディングスキルを向上させることができます。もしあなたができれば、答えを投票した理由を教えてください。 – MiguelKVidal

+0

私はダウンした有権者ではありませんが、まったく別のアプローチを提案した人の問題を本当に解決していないからかもしれません。 – csmckelvey

+0

@csm_dev良い点。しかし、私はコメントに彼に "答え"を与えました...私はそれを明確にしようとします。ありがとう! – MiguelKVidal

0

注:自分自身は初心者ですので、100%正確ではないかもしれません。

オブジェクト参照型(参照されるオブジェクトではなく参照変数の型)によって、オブジェクトに実装できるメソッドが決まります。たとえば、参照変数Objectオブジェクトは、Objectクラス(すべてのJavaクラスのスーパークラス)で定義されたメソッドのみを使用できます。ただし、このメソッドはObjectクラスには含まれていないため、Objectオブジェクトに対してgetState()メソッドを呼び出すことはできません。 getState()はサブクラスEngineで定義されているため、Engineオブジェクトでのみ使用できます。

このように、CarPartクラスを抽象化し、そのクラスのabstactメソッドgetState()とprintState()を実装し、それぞれのサブクラス(各車のパーツに対応)でこれらのメソッドをオーバーライドすることをお勧めします。また

class abstract CarPart { 
    abstract String printState(Object object); 
    abstract String getState(); 
} 

class Engine extends CarPart { 
    String getState() { 
     //code 
    } 

    String printState() { 
     //code 
    } 
} 

、あなたは最終的にちょうどエンジンサブクラス以上のものを持っているでしょうから、私は単純にその部分の個々のクラスからの各オブジェクトを作成する代わりにこれを行うには車のクラスを作成することをお勧めしたいです。単一のクラスを使用してさまざまなタイプのオブジェクトを作成するより効率的な方法があるかもしれませんが、私は現在それを認識していません。

関連する問題