2017-08-23 16 views
2

この練習で継承を実装する方法は?継承の実装

車のディーラーは、コンピュータシステムが車のデータを管理し、種類別に分類することを望んでいます。

  • 全車持って、次のデータ

    1. エンジンシリアル番号
    2. ブランド
    3. 車がコンパクトカーに分類されている
  • 価格,高級車,トラックおよびワゴン

  • 車とワゴンについては、人の乗客数をに保存することも重要です。トラックの場合、負荷容量はkg単位で制御する必要があります。 軸番号ラウンドです。

  • このシステムをモデル化し、各クラスをインスタンス化して、それぞれのプロパティでデータを割り当てます。パラメータ化されたコンストラクタを各クラスに追加してデータを初期化し、各派生クラスのコンストラクタから基本クラスコンストラクタを呼び出します(デフォルトのコンストラクタは使用しないでください)。

  • toString()メソッドのオーバーライドを実装して、autoの各タイプのデータを表示します。 注:重複するコンポーネントは、クラスまたは空のクラス(要素なし)には使用できません。

私が試したもの:(継承が正しいかどうかはわからない)

interface Passegers { 

    int CantidadPasajeros(int n); 

    int Pasajeros(); 
} 

class Vehicle {} 

class Auto extends Vehicle implements Passegers { 

    private int numSerieMotor; 
    private String marca; 
    private int año; 
    private double precio; 

    public int CantidadPasajeros(int n) { 
     return n; 
    } 
} 

class CompactAutos extends Auto { 
    public int CantidadPasajeros(int n) { 
     return n; 
    } 
} 

class LuxuryAutos extends Auto { 
    public int CantidadPasajeros(int n) { 
     return n; 
    } 
} 

class Truck extends Auto { 
    private int capacity; 
    private int axes; 
    private int rounds; 
} 

class Wagon extends Vehicle implements Passegers { 
    public int CantidadPasajeros(int n) { 
     return n; 
    } 
} 

public class Tarea22ago { 
    public static void main(String[] args) { 
     Vehicle x[] = new Vehicle[3]; 
     x[0] = new Auto(); 
     x[1] = new Wagon(); 
     x[2] = new Truck(); 
    } 
} 

しかし、クラスVehicleは空になります。私はまだ各クラスにコンストラクタを書く必要がありますが、私はちょうどこの継承の使用法が正しいかどうか確かめたいです。

+0

は、あなたの質問やコードをフォーマットするための時間がかかるしてください。あなたの課題のルーブリックはブロック引用符で囲まれていなければなりません(行頭に '>'を使い、 '*'を使って項目のリストを表示してください)あなたのコードも正しく字下げする必要があります。 。 –

+0

大丈夫次回は@Andy – Michelle

+0

を考慮に入れます。さらに重要なのは、Java命名規約に従ってください!メソッド名**は大文字で始まらないでください。 –

答えて

3

私はちょうどあなたのコードを通過し、上から下にコメントします。 一般的な注意点は、Javaコード規約に従うことです。

あなたのインターフェイスは、次のような細かいですが、セッターが値を返さないことを命名し、大会は、それあなたが同様に負荷の車両へのインタフェースで投げるかもしれない

interface Passengers { 
    void setPassengers(int count); 
    int getPassengers(); 
} 

ます。

interface LoadVehicle { 
    int getCapacity(); 
    int getAxes(); 
    int getRounds(); // what is this anyway? 
} 

このインターフェイスにはセッターはありません。これらの項目は変更されません(下記のGhostCatのコメントcfg)。

Vehicleクラスはマーカーインターフェイス(「マーカー」は単に車両であることを示していますが、メソッドを定義していないということを意味します)でもかまいません。

interface Vehicle {} 

(これは、他の2つのインターフェイスがinterface Passengers extends Vehicleinterface LoadVehicle extends Vehicleのように、それを拡張することができます)。

Autoクラスには必要なコンストラクタがありません。 すべての自動車に乗客がいるわけではないので、そのインターフェースを実装する必要はありません。

CompactCarクラスとLuxuryCarクラスの作成には、区別がないように見えません。一般的なクラスがそれを行う必要があります。

class PassengerCar extends Car implements Passengers { 
    // add getter and setter for this to implement the interface 
    private int passengers; 
    PassengerCar(String brand, int year, int engNum, double price) { 
     super(brand, year, engNum, price); 
    } 
} 

この場合、LuxuryCarsまたはCompactsを作成することができます。

同じように、トラック用の車を作成できるようになりました。

class LoadCar extends Car implements LoadVehicle { 
    // again, getters for these for the interface 
    private int capacity, axes, rounds; 
    // and constructor 
    LoadCar(String brand, int year, int engNum, double price, 
     int cap, int axCount, int roundCount) { 
     super(brand, year, engNum, price); 
     // assigs the other parameters to variables 
    } 
} 

他の区別がない場合、トラックはLoadCarとして作成することができます。

ワゴンの場合、ワゴンクラスには必要なロード機能がありません。 LoadCarまたはPassengerCarをサブクラス化するかどうかを決定する必要があります。結局のところ、それは両方です。どちらの場合でも、もう一方の欠落したインターフェースを実装する必要があります。 乗客インターフェイスは簡単ですので、私はこれでいいと思う:

class Wagon extends LoadCar implements Passengers { 
    // again, getter and setter for this for the interface 
    private int passengers; 
    Wagon(String brand, int year, int engNum, double price, 
     int cap, int axCount, int roundCount) { 
     super(brand, year, engNum, price, cap, axCount, roundCount); 
} 

あなたはこれらのクラスを使用すると思いますするシステムでは、あなただけで作業をすると思いますので、それは本当に問題で拡張するためにどのませんインタフェース。

EDIT: だからここにあなたがあなたのオブジェクトを作成します方法は次のとおりです。

// create a luxury car 
PassengerCar luxuryCar = new PassengerCar("BMW", 2017, 322131, 49_999.99); 
// create a compact 
PassengerCar compactCar = new PassengerCar("Smart", 2014, 55231, 25_999.99); 
// create a truck 
LoadCar truck = new LoadCar("Mercedes", 2014, 2113321, 99_999.99, 10_000, 6, 4); 
// create a wagon 
Wagon wagon = new Wagon("Dodge", 2005, 551223, 19_999.99, 3_000, 6, 4); 

そしておそらくこの継承の効果を示すために:

ちなみに
List<Vehicles> vehicles = new ArrayList<>(); 
List<Passenger> passengerVehicles = new ArrayList<>(); 
List<LoadCar> loadVehicles = new ArrayList<>(); 

// everything is a vehicle: 
vehicles.add(luxuryCar); // fine 
vehicles.add(compactCar); // fine 
vehicles.add(truck); // fine 
vehicles.add(wagon); // fine 

// you can only add passenger vehicles the the passenger car list: 
passengerVehicles.add(luxuryCar); // fine 
passengerVehicles.add(compactCar); // fine 
passengerVehicles.add(wagon); // fine 
passengerVehicles.add(truck); // NO! a truck is not a passenger car. 

// you can only add load cars to the load car list: 
loadVehicles.add(luxuryCar); // NO! a PassengerCar is not a LoadCar. 
loadVehicles.add(compactCar); // NO, same reason 
loadVehicles.add(wagon); // fine 
loadVehicles.add(truck); // fine 

、ここに別のリストがあります:

List<Car> cars = new ArrayList<>(); 
// everything is a car: 
cars.add(luxuryCar); // fine 
cars.add(compactCar); // fine 
cars.add(truck); // fine 
cars.add(wagon); // fine 

車と車の区別のポイントは何ですか? ボートの販売を開始するとしましょう...

class Boat implements Vehicle, Passenger { 
    // add getter/setter 
    private int passengers; 
    public Boat(int keelDepth) { 
    } 
} 

これは意味します:

+0

素敵な正確な答え。 1つは上に追加することができるもの:A) "あまりにも生の"タイプ:意味:年はintではなく、適切なJavaの日付クラスであるべきです。エンジンのシリアル番号は、intでなく独自のクラスである必要があります。ブランドは文字列ではなく、列挙型でなければなりません。 B)これらのフィールドのほとんどは**最終**です。時間の経過とともに変化するべきではありません。そして、あなたはセッター()も取り除きます。 **不変の**オブジェクトのために努力しなさい - すべてを*変更可能なものにすることは絶対に避けてください! – GhostCat

+0

はトラックの車ですか?私はトラックそれは単なる車であり、車ではないと思う。あなたが言ったので私は混乱します:トラックはLoadCarとして作成することができるので、このようになります: 'class Truck extends LoadCar {...}? 'しかし、' LoadCarは車を拡張する 'ため、過渡性によってトラックは車です。 – Michelle

+0

インターフェイスでクラスを拡張できますか?この質問は私がなぜ 'class Vehicle {} 'の代わりに' interface vehicle {} 'を宣言したのか不思議に思っていたので出てきます。 – Michelle

-1

この概念は、より良いあなたを助けるかもしれない:

public interface IVehicle{ 
    int getNumberOfWheels(); 
} 

public interface IPassenger{ 
    void getGender(); 
    void getType(); // Driver or customer 
} 

public class Vehicle implements IVehicle{ 

    protected ArrayList<Passenger> _passengers; 

    public Vehicle(int numberOfPassengers){ 
    _passengers = new ArrayList<Passenger>(numberOfPassengers); 
    } 

} 

public class Passenger implements IPassenger{ 
} 

public interface IVehicleAuto implements IVehicle{ 
} 

public abstract class VehicleAuto extends Vehicle implements IVehicleAuto{ 
} 

public class Car extends Vehicle { 
} 

public class CarAuto extends Car implements IVehicleAuto { 
} 
+0

インターフェイスは大文字Iで始める必要はありません(それは古い標準/慣習です) - ローカル変数はアンダースコアで始める必要はありません(同じ理由) - – ochi

+0

合意。答えを与えるときは、標準的な命名規則に注意する必要があります。これはIInterfaceでのC#でも_privateメンバーによるPythonでもありません。 – GhostCat

+0

私のスタンダードは、スタンダードのベストをとり、スタンダードとして使用しました。私にこれをさせないウェブサイトのルールはありますか?もしあなたが何を言っているのであれば、それは何ですか? –

-2

溝乗客インターフェイスは、代わりに、車両のクラスを持っている乗客と呼ばれるインスタンス変数を持っています。 車両を抽象化する。 サブクラスを作成します。 車両クラスに共通のインスタンス変数をリファクタリングします。 各クラスのコンストラクタを追加します。

+1

私はdownvoteをしなかったが、私は同意する:これは答えのように読まれない。 (非常に怠惰な)ダンプされたコメントのように見えます。 – GhostCat

関連する問題