1

サブクラスの保護された関数をオーバーライドしています。

AppleとFruitの2つのクラスがあるとしましょう。私はすべての変数を配置しています。これは単純化されたバージョンです。

class FruitBasket
   protected function getRandom():Fruit
    {
        // return random piece of fruit
    }

class AppleBasket extends FruitBasket
   protected override function getRandom():Apple
    {
        // return random apple
    }

class Fruit

class Apple extends Fruit

例は簡単です。問題は、getRandom関数のタイプがそれ自体のタイプに依存することです。1つはリンゴを返し、もう1つは果物を返します。もちろん、オーバーライドと強制についてエラーが発生します。

Appleの代わりにFruitを返そうとしましたが、オブジェクトはAppleではないため、Apple固有のプロパティはありません。問題はダックタイピングにあります。変更できない3番目のクラスがあります。これは各オブジェクトでgetRandom()関数を実行し、Appleは少し異なるものである必要があります。

AppleのgetRandom関数をオーバーライドして、フルーツではなくアップルを返すようにするにはどうすればよいですか?

4

2 に答える 2

0

AS3でのダックタイピングに相当するのは、「*」または「オブジェクト」タイプです。

于 2013-03-05T09:16:28.513 に答える
0

これは円-楕円問題です。私は単に関数をオーバーライドしません。むしろ、関数の名前をより具体的に変更します。そのため、AppleBasketで名前をgetRandomApple()に変更します。あなたのセマンティクスは少し泥だらけになっているので、私は物事を分離して明確にします。

FruitBasketで関数名を変更できないのは残念です。これは、セマンティクスを明確にするためにgetRandomFruit()に変更するためです。

于 2011-09-26T20:01:59.307 に答える