2012-03-26 10 views
4

私はVehicleクラスを持っています。車から、私はCarクラス(そしてBus、Bike ..のようないくつかのもの)を拡張します。今私のアプリケーションでは、ユーザーがどのような種類の車両で作業したいのか分かりません。そこで私はVehicleオブジェクトを作成し、後で適切なオブジェクト(Car、Bus、...)を作成します。その後、私はいくつかの車の機能を呼びたい - しかし、私はそれに到達することはできません。どうして?拡張クラスへのアクセス方法 'function?

Vehicle vehicle=null; 
. . . 
vehicle=new Car(); 
vehicle.someMethodFromCar(); //can't reach it 

答えて

7

我々はキャストする必要があります:

((Car) vehicle).someMethodFromCar(); //we can reach it 

vehicleはまだVehicle型として宣言されています。サブタイプがVehicleの場合は変更されません。 Vehicleクラスには、Carクラスの特別なメソッドはありません。キャスティングは、サブタイプからメソッドを呼び出す方法です。

+0

キャストせずにこれを行う方法はありますか?抽象化を使用するかスーパークラスを呼び出すか? –

+0

ありがとう、これは私が必要としていたものです。 –

+0

'someMethodFromCar'は' Car'でのみ定義され、必要なメソッドです。したがって、抽象化は助けにはなりません。なぜなら、VehicleクラスのCar-methodsを宣言したり実装したりしたくないからです(他のすべてのサブタイプに実装を提供することを強制...) –

1

vehicleCarにキャストする必要があります。

+0

ありがとうございます。 –

3

あなたの参照はその宣言された型で定義されているため、車の参照vehicleがCarオブジェクトに割り当てられていますが、Javaでは参照の型のみが表示されるため、メソッド。 これを行うには、オブジェクトをCar変数に割り当てるか、参照をCarにキャストする必要があります。

1

2通りの方法があります。

  1. は抽象クラスとして車両を作ります。一般的な方法を車両クラスの抽象として定義する。そのため、車両を拡張する場合、サブクラスは抽象メソッドを実装する必要があります。だから、あなたがするとき

    Vehical v = new Car();

    v.someOverrideMethod(); 車のメソッドを呼び出します。

  2. 実行時にサブクラスでアクセスするオーバーライドメソッドです。だから、あなたが好きなら、

    Vehical v = new Car();

    v.someOverrideMethod();

実行時に、JVMはオブジェクトが作成されているかどうかを調べ、そのオブジェクトのメソッドは実行時に呼び出されます。

+0

ありがとうございます。それらの2つのメードは便利かもしれないが、私の現在のケースでは私はそのように働くことができない。 –

関連する問題