以不同方式重用相同的功能

Mik*_*ike 2 java

我有这样的课

class Calculate {
    int operation(int a, int b){
         return Math.max(a,b);
    }
    int calc(int a, int b){
        int x=100+a*b;
        int y=a+a*b;
        retun operation(x,y);
    }
    int calc1(int a, int b){
        int x=100+a*b;
        int y=b+a*b;
        return operation(x,y);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我创建这个类的两个对象,因为
Calculate obj1=new Calculate();
Calculate obj2=new Calculate();
我想要类的函数操作计算为obj1返回两个值的最大值,并返回obj2的两个值的最小值.可以这样做吗?
我只能想到创建两个不同的类Calculate1和Calculate2,并在Calculate1中将操作定义为最大值,在Calculate2中定义最小值,并将其定义为与其相同.我希望在不定义两个类的情况下也可以使用一些更简单

ass*_*ias 6

您可以通过操作来构造函数IntBinaryOperator,例如:

class Calculate {

  private final IntBinaryOperator op;

  public Calculate(IntBinaryOperator operator) {
    this.op = operator;
  }

  int operation(int a, int b) {
    return op.applyAsInt(a, b);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以写:

Calculate c1 = new Calculate(Math::max);
Calculate c2 = new Calculate(Math::min);
Run Code Online (Sandbox Code Playgroud)

添加操作很容易 - 比如你想要总和而不是最小值或最大值:

Calculate c3 = new Calculate((x, y) -> x + y);
Run Code Online (Sandbox Code Playgroud)


Era*_*ran 5

您可以覆盖该operation方法.

如果您不想创建显式子类,可以使用匿名类执行此操作:

Calculate obj1=new Calculate();
Calculate obj2=new Calculate() {
    int operation(int a, int b){
        return Math.min(a,b);
    }
};

obj1.operation(a,b) // calculates maximum
obj2.operation(a,b) // calculates minimum
Run Code Online (Sandbox Code Playgroud)

  • 它可能.这似乎取决于具体情况.假设Calculate对象的标准是它们找到max,并且程序中有许多Calculate对象.如果由于某种原因,一个Calculate对象需要成为规则的例外,Eran的答案更合适.如果根本没有该方法的标准,那么使该方法抽象将更好.如果该类没有标准,则整个Calculate类将是抽象的,并且应该使子类执行各种操作. (2认同)