【问题标题】:Two extends classes, have object that inherit from each other, best practise?两个扩展类,有相互继承的对象,最佳实践?
【发布时间】:2017-01-19 19:07:45
【问题描述】:

我想优化代码以使用“BDTO 扩展 ADTO”,而不是在 DForm 和 EForm 中复制方法 any() 创建一个新的类抽象 (CForm) 以及在何处放置逻辑方法 any()。

如何解决重复方法?最佳实践如何?

public class ADTO {

    public String a;

    public String getA() {return a;}

    public void setA(String a) {this.a = a;}
}



public class BDTO extends ADTO{

    public String b;

    public String getB() {return b;}

    public void setB(String b) {this.b = b;}
}

public abstract class CForm {

    ADTO aDTO;

    //  BDTO bDTO;

    public ADTO getADTO() {return aDTO;}

    public void setADTO(ADTO aDTO){this.aDTO = aDTO;}

    //  public BDTO getbDTO() {return bDTO;}

    //  public void setbDTO(BDTO bDTO) {this.bDTO = bDTO;}


    public void any() {//
        aDTO.getA();    //
    }                   //
                        // how resolve duplicate method ?
    //public void any(){    // when i use only attribute aDTO and run any1() in EForm, aDTO is null
    //  bDTO.getA();    //
    //}

}

public class DForm extends CForm {

    public void anyD(){

        getADTO().setA("test");
        any(); // run method here is ok
    }

}


public class EForm extends CForm{

    //form using here any() and BDTO
    public void anyE(){
        getADTO().setA("test");
        any(); //run method here aDTO is null, why?
    }

}

【问题讨论】:

  • 您能更具体地说明您的问题吗?您的代码没有按预期工作吗?
  • 我想优化代码以使用“BDTO 扩展 ADTO”,而不是在 DForm 和 EForm 中复制方法 any() 创建一个新的类抽象 (CForm) 以及放置逻辑方法的位置 any() .

标签: java interface abstract extends


【解决方案1】:

Java 不允许重复的方法(至少不像你想要的那样)。

但是你可以做什么(我认为这就是你想要的):你可以创建一个 any() 方法,随机调用 aDTO.getA()bDTO.getB() 或选择任何可用的方法并运行该方法。

您的 any() 方法可能如下所示(随机):

public void any() {
    if(new Random().nextBoolean())
        aDTO.getA();
    else
        bDTO.getB();
}

或者像这样(第一个可用):

public void any() {
    if(aDTO != null)
        aDTO.getA();
    else if(bDTO != null)
        bDTO.getB()
}

【讨论】:

  • @user3750157 所以你想要一个抽象类,它可以对 any() 方法进行任何实现?如果是这样,只需将方法抽象化(不实现)并让单独的类实现抽象类并使用其自定义版本的 any() 方法。如果不是这样,我不知道你真正想要完成什么。另外:因为你的两个类几乎相同(除了 getX 和 setX 中的 X [所有类型都相同])你为什么不首先概括为一个类(使用 get() 和设置(字符串))
  • 不是我的意思。以前,我有
     public class DForm{ BDTO aDTO; public void any(){ aDTO.getA(); } //其他使用aDTO } public class EForm { BDTO bDTO; public void any(){ bDTO.getA(); } //其他使用 bDTO } <pre> 现在想将 any() 方法移动到新的抽象类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多