0

考虑以下一段代码:

class NumberWrapper {
   boolean negative;
   void setNegativeTrue(boolean isNegative) {
      negative = isNegative;
   }

   void  negateNumber(int x) {
      if (negative) {
          x = x * -1;
      } else {
         x = Math.abs(x);
      }
      return x;
   }
}

在这样的代码中,如何使用多态性?

4

2 回答 2

3

您可以boolean用两个不同的类替换导致两个不同代码路径的参数,每个类实现一个路径。

abstract class Foo {
    abstract void calculate(int x);
}

class NormalFoo extends Foo {
   void calculate(int x) {
      x = Math.abs(x);
      return x;
   }
}

class NegativeFoo extends Foo {
   void calculate(int x) {
       x = x * -1;
      return x;
   }
}

而不是setNegativeTrue您创建这些类之一,从而用多态性替换条件

于 2013-08-18T22:04:46.563 回答
2
public enum UnaryOperator {

    NEGATE {
        @Override
        public int apply(int x) {
             return -x;
        }
    }, 
    ABS {
        @Override
        public int apply(int x) {
             return Math.abs(x);
        }
    }

    public abstract int apply(int x);
}

class Foo {
    private UnaryOperator operator = UnaryOperator.ABS;

    void setUnaryOperator(UnaryOperator operator) {
        this.operator = operator;
    }

    void calculate(int x) {
        return operator.apply();
    }
}
于 2013-08-18T22:04:11.733 回答