3

約 12 個の else if があり、これらの if ステートメントのそれぞれが 2 つのオブジェクトの instanceof をチェックするので、次のようなものがあるため、本当にクリーンアップしたいこの厄介なコードがあります。

それぞれの if ステートメントは異なるものを実行するので、ポリモーフィズムによってそれが改善されることはないと思います。また、この小さな機能に対して 12 の異なるスーパー クラス (ほとんどの if ステートメントが 1 つのライナーを実行する) は少しばかげているためです。ポリモーフィズムが機能しないもう 1 つの理由は、親クラスまたはスーパー クラスにアクセスできないためです。多くの instanceof 条件は、一般的によくないことを知っていますが、その理由はよくわかりませんでした。各 if ステートメント内で実行されるメソッドは、親クラスのものではなく、スーパー クラスのものです。そのため、キャストしてそれらのメソッドを実行できるように、それらの型をチェックする必要があります。これをどのようにクリーンアップできるかについてのアイデアはありますか? ありがとう!

編集:詳細がなくてすみません、これは私の電話で書きました。とにかく、以下は私が扱っているものの例です。私は戦略パターンを見てきましたが、それに関する私の唯一の懸念は、同じ理由で、多くの異なるクラスを作成する必要があり、1 つのライナーを常に実行するためだけに多くの異なるオブジェクトを作成するのは少し無駄だと感じたことです。 . また、戦略の設計では、どの戦略を実行するかを知るために多くの instanceof チェックを行う必要があるように思えます。とにかく、以下はいくつかのコードです:p

if (plotBlockState instanceof Sign && UpgradeBlockState instanceof Sign) {
    //do Sign Stuff
}
else if (plotBlockState instanceof Chest && UpgradeBlockState instanceof Chest) {
    //do Chest Stuff
}
else if (plotBlockState instanceof Dispenser && UpgradeBlockState instanceof Dispenser) {
    //do Dispenser Stuff
}
else if (plotBlockState instanceof Furnace && UpgradeBlockState instanceof Furnace) {
    //do Furnace Stuff
}
else if (plotBlockState instanceof BrewingStand && UpgradeBlockState instanceof BrewingStand) {
    //do Brew Stand Stuff
}
else if (plotBlockState instanceof Hopper && UpgradeBlockState instanceof Hopper) {
    //do hopper Stuff
}
else if (plotBlockState instanceof Dropper && UpgradeBlockState instanceof Dropper) {
    //do dropper Stuff
}
else if (plotBlockState instanceof Beacon && UpgradeBlockState instanceof Beacon) {
    //do beacon Stuff
}
else if (plotBlockState instanceof CreatureSpawner && UpgradeBlockState instanceof CreatureSpawner) {
    //do spawner Stuff
}
else if (plotBlockState instanceof NoteBlock && UpgradeBlockState instanceof NoteBlock) {
    //do noteblock Stuff
}
else if (plotBlockState instanceof Jukebox && UpgradeBlockState instanceof Jukebox) {
    //do jukebox Stuff
}
else if (plotBlockState instanceof Skull && UpgradeBlockState instanceof Skull) {
    //do skull Stuff
}
else if (plotBlockState instanceof CommandBlock && UpgradeBlockState instanceof CommandBlock) {
    //do commandblock Stuff
}
4

1 に答える 1

9

柄はStrategy地味に似合いそうです。ここにウィキペディアの記事へのリンクがあります。始めるには十分すぎるはずです。また、提供したコードが 0 であるため、私も提供しないと思います。

でも気持ちいいから

まず、共通のインターフェースまたはスーパークラスを実装してもらいます。これは、それらがどのタイプのクラスであるかをテストする必要がないようにするためです。同じメソッドを呼び出すだけです。ポリモーフィズムは問題外だとあなたが言ったことは知っていますが、その理由はわかりません。スーパー クラスにアクセスできない場合は、共通のインターフェイスを作成します。

例えば:

// Undesirable syntax.
if(obj instanceof Dog)
{
    ((Dog)obj).woof();
}
else if(obj instanceof Cat)
{
    ((Cat)obj).meow();
}
else if(obj instanceof Lion)
{
    ((Lion)obj).roar();
}

次に、いくつかの共通インターフェースを定義しましょうAnimal:

public interface Animal
{
    public void speak();
}

これで、instanceofツリーは次のようになります。

public void makeTalk(Animal obj)
{
    obj.speak();
}
于 2013-08-14T12:40:43.403 に答える