2016-04-05 7 views
2

私は現在、Javaクラスとオブジェクトをjava tutorial oracleから学んでいますが、次の文とコードがあります。概念を理解していますが、なぜメソッドをオーバーライドして元のメソッドのスーパークラスを返すことができないのかわかりません。その背後にある理由は何ですか?誰かが私を啓発してくれますか?助けをあらかじめありがとう!なぜメソッドをオーバーライドして元のメソッドのスーパークラスを返すことができないのですか?

あなたは、メソッドをオーバーライドし、 元のメソッドのサブクラスを返すように定義し、このようにすることができます

public Number returnANumber() { 
    ... 
} 

上書き元のメソッド:

public ImaginaryNumber returnANumber() { 
    ... 
} 
+3

@KevinEsche、それはかなり正確ではありません。メソッドをオーバーライドして、サブクラスを返すことができます。なぜ – shmosel

+0

@shmoselはええyou're右私の悪い – SomeJavaGuy

+2

チュートリアルでは、すでに説明:_However、オブジェクトは必ずしも数値ではありません - それは、クライアントの文字列または別のtype._ – Joni

答えて

4

は想像:

public class CarFactory { 
    Car giveMeACar() { ... }; 
} 

public class SpecialCarFactory extends CarFactory { 
    @Override 
    Object giveMeACar() { 
     return "hello world"; 
    } 
) 

public class Driver { 
    void drive() { 
     CarFactory carFactory = new SpecialCarFactory(); 

     Car car = carFactory.giveMeACar(); 
     // err, wait, sorry, can't do that. 
     // This car factory, despite its name, doesn't produce cars. 
     // It produces objects, and I've heard they're just 
     // "hello world" strings. Good luck driving a "hello world" 
     // string on a highway! 
    } 
} 

を参照してくださいが、それだけで契約のことです。あなたがコーヒーショップに行くとき、あなたはコーヒーを売ることを期待しています。この契約に準拠していない場合、「コーヒーショップ」と呼ばれることはありません。コーヒーショップはコーヒーを売る必要があります。 搾乳されたコーヒーはまだコーヒーですので、搾乳したコーヒーを売ることができます。 (トヨタ車ですので、ちょうど自動車工場のように、唯一のトヨタを生成することができ、そしてあなたも、それはトヨタです知らなくても、他の車、のようにトヨタをドライブすることができます:それは多型です)。

0

それはdoesnのより一般的なクラス(つまりスーパークラス)を返すメソッドをオーバーライドするのが理にかなっています。この場合、少なくとも "01"を返す "契約"を破っているからですrに対応する機能を備えています。突然誰かが唯一の定期的なNumberを返すために、このメソッドをoveeride場合、それらはImaginaryNumber(非虚数のために意味がありませんgetImaginaryPart()のような多分彼らはcalliingている何かを)得ることに依存しているとして、そのメソッドの呼び出し元が解除されます。

サブクラスは、スーパークラスと少なくとも同じ機能を有するので、ラウンド他の方法(例えば、サブクラスを返す、すなわち、より具体的なクラスである)、契約を破壊しません。

0

誰かがスーパークラスを使用するコードを書くとき、彼らは唯一のスーパークラスで定義された契約に依存しています。

SuperClass instance = ... 
Number num = instance.returnANumber(); 

今、instancereturnNumber()をオーバーライドすることがあり、その一部SuperClassのいずれかのサブクラスのインスタンスである可能性があります

ですから、このような何かを書くことができます。オーバーライドメソッドがNumberのサブクラスを返した場合、それはまだ(Numberの任意のサブクラスは依然としてNumberある)Number返すので、割り当てはまだ有効です。オーバーライドするメソッドがNumberのスーパークラスを返すことができる場合、その割り当てはもはや有効ではないため、許可されません。それが可能だった場合

関連する問題