代码之家  ›  专栏  ›  技术社区  ›  mgamer

Java多态方法

  •  0
  • mgamer  · 技术社区  · 15 年前

    在Java中,我有一个名为“操作”和“三”的抽象类,它的子类叫做操作激活、操作支付和操作电子邮件。

    从注释中添加:operation*对象是EJB实体bean,因此我不能在其中包含业务逻辑。

    不,我想创建这样的处理器类:

    public class ProcessOperationService {
    
    public void processOperation(Operation operation) {
        out.println("process Operation");
        process(operation);
    }
    
    public void process(OperationActivation operationActivation) {
        out.println("process Activation");
    }
    
    public void process(OperationPayment operationPayment) {
        out.println("process Payment");
    }
    
    public void process(OperationSendEmail operationSendEmail) {
        out.println("process OperationSendEmail");
    }        
    

    }

    处理每个操作需要不同的逻辑,所以我希望有三种不同的方法,每个操作一种。

    当然,这段代码不会编译。我是错过了什么,还是做不到?

    6 回复  |  直到 15 年前
        1
  •  4
  •   Brian Agnew    15 年前

    你不应该 Operation* 对象自己在做工作?所以你可以写(说)

    for (Operation op : ops) {
       op.process();
    }
    

    您可以在自己的类中封装每个特定操作的逻辑,这样,与OperationPayment相关的所有内容都将保留在OperationPayment类中。您不需要处理器类(因此您不需要每次添加操作时都修改处理器类)

    有更复杂的模式来允许对象中介WRT。他们需要执行什么,但我不确定你在这个阶段需要什么复杂的东西。

        2
  •  5
  •   Avi    15 年前

    您混合了重载和多态方法处理。当根据参数类型重载方法时,即 静止的 多态性。这些方法应该从在编译时知道类型的代码中调用。您可以执行以下操作,但这不是一个干净的面向对象代码:

    public class ProcessOperationService {
    
    public void processOperation(Operation operation) {
        out.println("process Operation");
        if (operation instanceof OperationActivation)
            process((OperationActivation)operation);
        else if (operation instanceof OperationPayment)
            process((OperationPayment)operation);
        ...
    }
    
    public void process(OperationActivation operationActivation) {
        out.println("process Activation");
    }
    ...
    }
    

    按照布莱恩·阿格纽的建议,让自动运行时多态性工作,并使过程成为每个操作子类型本身的一种方法,这样做会更好。

        3
  •  1
  •   brabster    15 年前

    假设:operation*对象是operation的子类

    除非processOperation(operation)方法正在执行一些公共功能,否则您可以移除它并公开流程(operation)方法。

    命令模式( JavaWorld Explanation )可能很有用,但很难准确地说出你想从问题中得到什么属性。

        4
  •  1
  •   Mikezx6r    15 年前

    代码的问题在于,任何与流程(operation*)方法之一匹配的对象也将与流程(operation)方法匹配。由于有两种方法可以使用,编译器会警告您出现不明确的情况。

    如果你 真的? 想要/需要上面的代码,我建议实现流程(operation*)方法,并修改流程(operation)方法,使其称为processcommon(operation)。然后,每个进程(操作*)所做的第一件事就是调用processcommon。

    或者,您可以使用instanceofcomparison精确地按照avi所说的进行编码。

    两者都不是理想的,但它会实现你想要的。

        5
  •  1
  •   Aaron Chambers    15 年前

    所以你有一个抽象类叫做' 操作 它有三个类来扩展它。不确定这是不是你想要的,但我想它是这样设计的:

    操作程序

    public abstract class Operation {
    
        public abstract void process();
    
    }
    

    操作激活.java

    public class OperationActivation extends Operation {
    
        public void process() {
    
            //Implement OperationActivation specific logic here
    
        }
    
    }
    

    操作支付.java

    public class OperationPayment extends Operation {
    
        public void process() {
    
            //Implement OperationPayment specific logic here
    
        }
    
    }
    

    操作发送电子邮件.java

    public class OperationSendEmail extends Operation {
    
        public void process() {
    
            //Implement OperationSendEmail spepcific logic here
    
        }
    
    }
    

    处理操作服务.java

    public class ProcessOperationService {
    
        public void processOperation(Operation operation) {
    
            out.println("process Operation");
            operation.process();
    
        }
    
    }
    
        6
  •  1
  •   sateesh    15 年前

    访客模式在这里有用吗?

    类操作可以声明一个接受访问者对象的方法,子类可以提供实现:

    public interface IOperationVisitor {
       public void visit (OperationActivation visited);
       public void visit (OperationPayment visited);
       public void visit (OperationSendEmail visited);
    }
    
    abstract class Operation {      
       public void accept(IOperationVisitor visitor)();
    }
    
    class OperationActivation extends Operation {
        public void accept(IOperationvisitor visitor) {
             visitor.visit(this);
        }
    }
    

    同样,为类OperationPayment和OperationSendEmail定义“接受”方法。

    现在,您的类可以实现访问者:

    public class ProcessOperationService implements IOperationVisitor  {
    
         public void processOperation(Operation operation) {
             operation.accept(this);
         }
    
         public void visit (OperationActivation visited) {
            // Operation Activation specific implementation
         }
    
         public void visit (OperationPayment visited) {
            // OperationPayment  specific implementation
         }
    
          public void visit ((OperationSendEmail visited) {
            // (Operation SendEmail specific implementation
           }
      }