【问题标题】:Consumer with Polymorphism in interface接口中具有多态性的消费者
【发布时间】:2021-10-25 04:15:02
【问题描述】:

最后我自己解决了问题 事实证明,消费者可以改变 并通过接口让我的xxx_dialogs和Compulsory使用openDialog函数。

产品、客户的数据 bean 开始

public class Prod extends MyBean { 
    private String P_NO = "";       
    private setP_NO(String p_no){
        P_NO= p_no;
    }
    private String getP_NO(){
        return P_NO;
    }
}   

public class Cust extends MyBean { 
    private String CUST_NO = "";   
....
}   
public class MyView{
  TextField textFieldP_NO;
  Button btnProd;
  Button btnCust;
  public MyView (){
      //...constructor...
    }
    btnProd.addClickListener(e -> {
        Prod_Dialog p_dlg = new Prod_Dialog();
        //fix before
        //p_dlg.openDialog(p -> textFieldP_NO.setValue(p.getP_NO()));
        //fix after
        p_dlg.openDialog(p -> textFieldP_NO.setValue(((PROD_Dialog.Prod) p).getP_NO()));
    });
    btnCust.addClickListener(e -> {
        Cust_Dialog c_dlg = new Cust_Dialog();
        //fix before
        //c_dlg.openDialog(c -> textFieldP_NO.setValue(c.getCUST_NO()));
        //fix after
        c_dlg.openDialog(c -> textFieldP_NO.setValue(((CUST_Dialog.Cust) c).getCUST_NO()));
    }); 
} 

[接口] 修复参数消费者可以多态

public interface BaseDialog {
    //fix before just for prodct. That's bad....
    //public abstract void openDialog(Consumer<Prod> selectionAction);
    
    //fix after that can service any MyBean...
    public abstract void openDialog(Consumer<? extends MyBean> selectionAction);
}

[Dialog] with Prod_Dialog and cust_Dialog thougth clickok method pass Consumer<Prod> or Consumer<Cust>

//fix before
//public class Prod_Dialog {
//fix after 
public class Prod_Dialog implements BaseDialog{
  private Button btnOk;  
  ...
  //fix before
  //public void openDialog(Consumer<Prod> selectionAction) {
  //fix after     
  public void openDialog(Consumer<? extends MyBean> selectionAction) {
      btnOk.addClickListener(e -> {
        //fix before
        // Prod sel_prod = grid.asSingleSelect().getValue();
        // String p_no = sel_prod.getP_NO(); //get user selected p_no
        
        // Prod prod = new Prod();
        // prod.setP_NO(p_no);        
        // selectionAction.accept(prod);
        
        //fix after that is magic point for me, by Consumer Transformation
        clickOK((Consumer<Prod>) selectionAction); 
      }
  }
  public void clickOK(Consumer<Prod> selectionAction) {
    Prod sel_prod = grid.asSingleSelect().getValue();
    String p_no = sel_prod.getP_NO(); //get user selected p_no
    
    Prod prod = new Prod();
    prod.setP_NO(p_no);        
    selectionAction.accept(prod); 
  }
}   

public class Cust_Dialog implements BaseDialog{
    private Button btnOk;  
    ...
    public void openDialog(Consumer<? extends MyBean> selectionAction) {
      btnOk.addClickListener(e -> {
        //fix before
        // Cust sel_cust = grid.asSingleSelect().getValue();
        // String c_no = sel_cust.getCUST_NO(); //get user selected p_no
        
        // Cust cust = new Cust();
        // Cust.setCUST_NO(c_no);        
        // selectionAction.accept(cust); 
        //fix after
        clickOK((Consumer<Cust>) selectionAction); //that is magic point for me, by Consumer Transformation
      }
    }
  
    public void clickOK(Consumer<Cust> selectionAction) {
    Prod sel_cust = grid.asSingleSelect().getValue();
    String c_no = sel_prod.getCUST_NO(); //get user selected p_no
    
    Cust cust = new Cust();
    cust.setCUST_NO(c_no);        
    selectionAction.accept(cust); //that is magic point for me  
    }
}   

【问题讨论】:

    标签: java interface polymorphism consumer vaadin14


    【解决方案1】:

    你的工作实现类代码方法签名

    public void openDialog(Consumer<PROD> selectionAction)
    

    与接口签名不同

    public abstract void openDialog(Consumer<? extends MyBean> selectionAction);
    

    不要在接口签名声明中写abstract(默认是public和abstract)!

    方法的参数将/必须/是 - 也总是相同的!

    实现类代码方法签名应该在接口上几乎完全一致,如果没有,完全一致。

    【讨论】:

    • 感谢 Samuel Marchant 回答点接口签名声明的正确方式。第二个问题是我的 Prod_Dialog.OpenDialog 参数与界面相同,但仍然无法解决编译器错误。
    • 在您的单击/按钮侦听器中,它应该调用接口方法,然后在调用 open 时应该是 prod_dialog 或 cust_dialog 但应该在 MyView 类中引用 BaseDialog 接口但是加载的实例化接口是其实现和加载的实例化类的多态类型(类型,类型,类名)。类实例是被调用的接口。 Consumer 是您创建的自定义类还是来自框架 API(如果 API 集)、哪个 API 和完整的类名?
    • nb:在创建实现类的类之前,您无法通过接口创建对话框(回到前面 - 错误的过程)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2021-07-09
    • 2011-10-23
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多