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



>我有两个类 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.
           }

B类 : 有 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的成员变量,并从子类构造函数初始化此变量。在所有方法中检查用户定义类型B是否为空。如果它不为 null,则 i 将执行特定于子类的逻辑,否则将继续使用 UserDefinedTypeB 的超类逻辑。

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

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

public abstract class SuperClass {
    String a;
    String b;
    Double c;
    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 d;
    public void m1logic(){
        // UserDefinedTypeA logic
    }
    public void m2logic(){
        // UserDefinedTypeA logic
    }
    public void m3logic(){
        // UserDefinedTypeA logic
    }           
}
public class ClassB extends SuperClass {
    UserDefinedTypeB d;
    public void m1logic(){
        // UserDefinedTypeB logic
    }
    public void m2logic(){
        // UserDefinedTypeB logic
    }
    public void m3logic(){
        // UserDefinedTypeB logic
    }           
}

您可以考虑使用泛型:

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,除非你有很好的理由。

最新更新