-1

Fruitクラスが superClass であり、AppleおよびOrangeが Fruit のサブクラスであり、およびGoldenDeliciousおよびが のMacintoshサブクラスである場合Apple

次の宣言が与えられたとします。

Fruit fruit = new GoldenDelicious();
Orange orange = new Orange();

この質問に答えて説明してください

メソッドがクラスmakeAppleCiderで定義されているとします。このメソッドを呼び出すAppleことができます か? fruitオレンジはこのメソッドを呼び出すことができますか???

私の答えは:果物はこのメソッドを呼び出すことができますか? 明示的なキャストがないため、Apple クラスで定義されたメソッドを呼び出せるように、フルーツ インスタンスの明示的なキャストを行う必要があります。この答えは本当ですか????

4

3 に答える 3

1

これは、変数の静的および動的タイプに飛び込みます。

Fruit fruit;

fruitこの行は static 型の変数を宣言していますFruit。この型は決して変更されず (結局のところ静的です)、通常はこの型を使用します。

fruit = new GoldenDelicious();

この行は、GoldenDeliciousその変数にある値を割り当てる行です。変数の動的型は、この変更を反映して変更されます。結局のところ、変数には実際にはGoldenDeliciousnow が含まれています。動的型は、通常は使用しないものですが、(evil) を使用するときに使用されますinstanceof(また、上書きされた関数が適切な場所で呼び出されるようにします)。

今、あなたはこれをしたい:

fruit.makeAppleCider();

これは機能しません。実は、私たちは基本的に静的型しか知りません。静的型Fruitはそのメソッドについて何も知りません。(しかし、舞台裏で、異なる方法で関数GoldenDeliciousMacintosh実装する場合、動的型は正しいバージョンが呼び出されることを確認します。)

回答で述べたように、明示的なキャストを使用して、作業中の静的タイプを変更できます。そのため、そのように機能させることができます。ただし、キャストは避けるべきであり、「適切な OOP」ではないため、そうしない方がよいでしょう。

結論として、はい、あなたの答えは正しかったです。

(はい、私の説明は少し専門的です。ご容赦ください...)

于 2012-04-20T21:22:17.737 に答える
0

もちろん、もう 1 つのオプションは、「インターフェイス」を使用することです。これは、貧弱な多重継承のようなものです (ただし、完全な多重継承よりも理解と実装がはるかに簡単です)。

たとえば、次のようなインターフェイスを使用できます(構文チェックなし)。

public interface CiderFruit {
    public void makeCider();
}

次に、Apple はインターフェースを実装できます。

public class Apple extends Fruit implements CiderFruit {
    ....
    public void makeCider() {
        doStuff();
    }
    ....
}

その後、Quince クラスがあれば、同じインターフェイスを実装でき、Apple または Quince のいずれかを取り、それを CiderFruit にキャストして (Apple か Quince か不明な場合)、 を呼び出すことができmakeCider()ます。(Apple または Quince として型付けされた参照で直接呼び出すこともできます。)

于 2012-04-20T21:15:21.510 に答える
0

AにはメソッドFruitの「知識」がありません。はサブクラスで定義されており、 のメンバーではありません。クラスは、そのクラスまたはその親の 1 つが定義するメソッドにのみアクセスできます。特定のタイプのクラスが与えられた場合、クラス階層をさかのぼって、アクセスできるメソッドを確認する必要があります。変数の型は、クラス階層をさかのぼるための出発点と考えることができます。makeAppleCidermakeAppleCiderFruit

すべてのクラスがアクセスできるようにするメソッドがある場合は、それを階層のルートに配置します。明らかに、メソッドを使用するロジックは理にかなっている必要があります。そうしないと、コードを使用する人が混乱します。

于 2012-04-20T21:03:40.427 に答える