用多态替换条件,但是如何做

时间:2013-08-18 21:56:25

标签: java oop

考虑以下代码:

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;
   }
}

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

2 个答案:

答案 0 :(得分: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,您可以创建其中一个类,从而用多态性替换条件

答案 1 :(得分: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();
    }
}