通过避免在特定场景中覆盖超类方法java来重用超类方法

时间:2018-01-31 05:21:00

标签: java method-overriding

我有两节课  A级:      包含4个不同数据类型的成员变量和3个方法(m1(),m2()和m3())

例如:

class ClassA
       {
           String a;
           String b;
           Double c;
           UserDefinedTypeA d;
         public m1(){
            //All the 4 variables are used here.
           }
         public m2(){
             //All the variables are used here.
           }
         public m3(){
            //All the variables are used here.
           }

ClassB:      有4个成员变量和3个方法(m1(),m2()和m3())。 其中三个成员变量与ClassA相同,只有第四个变量类型不同。

例如:

class ClassB
       {
           String a;
           String b;
           Double c;
           UserDefinedTypeB d;
         public m1(){
            //All the 4 variables are used here.
           }
         public m2(){
             //All the variables are used here.
           }
         public m3(){
            //All the variables are used here.
           }

现在我想避免在子类中覆盖m1,m2和m3,因为类型的第4个成员变量是不同的。 作为一个解决方案,我计划在超类中创建另一个成员变量,其类型为:UserDefinedTypeB,并从子类构造函数初始化此变量。检查UserDefinedTypeB是否为null的所有方法。如果它不为null,则i将执行子类特定逻辑,否则将继续使用支持UserDefinedTypeB的超类逻辑。

但是觉得这会降低性能。关于提出更好方法的任何建议。

2 个答案:

答案 0 :(得分:1)

更好的方法是引入超类SuperClass并为m1(),m2()和m3()移动3个公共变量和逻辑。

"execution": {
    //"PowerShell3": {
    //  "target": "Hello.ps1",
    //  "argumentFormat": ""
    //}
    "Process": {
      "target": "..\\ConsoleApplication1.exe",
      "argumentFormat": "$(ConnectedServiceName) $(currentDirectory) $(ApiPortalName)"
    }
  }

答案 1 :(得分:0)

你可以考虑使用泛型:

public abstract class SuperClass<T> {
    String a;
    String b;
    Double c;
    T d;

    public void m1(){
        //All the 4 variables are used here.
        m1logic();
    }

    public void  m2(){
        //All the variables are used here.
        m2logic();
    }

    public void  m3(){
        //All the variables are used here.
        m3logic();
    }

    public abstract void  m1logic();
    public abstract void  m2logic();
    public abstract void  m3logic();
}

public class ClassA extends SuperClass<UserDefinedTypeA> {
    public void m1logic(){
        // UserDefinedTypeA logic
    }

    public void m2logic(){
        // UserDefinedTypeA logic
    }

    public void m3logic(){
        // UserDefinedTypeA logic
    }           
}

public class ClassB extends SuperClass<UserDefinedTypeB> {
    public void m1logic(){
        // UserDefinedTypeB logic
    }

    public void m2logic(){
        // UserDefinedTypeB logic
    }

    public void m3logic(){
        // UserDefinedTypeB logic
    }           
}

我也会使用double而不是Double,除非你有其他正当理由。