1

我有 2 节课:

A类,其中包含很多功能。

Class A{
  public void a(int param1, int param2);
  public void b(String param1, int param2);
....}

B类也有同样的功能,但是有些参数是多余的,

Class B{
  public void a(int param1forB){}
  public void b(String param1){}
....}

我有检查 A 类的测试。我也想将这些测试用于 B 类。

另外两个问题:

  1. B包含在某些类中实现的函数A。例如, a在类A1中,函数b在类中A2

  2. 我想最小化 A 中的变化(在 B 中,我可以更改任何我想要的)。

任何想法?

4

4 回答 4

0

让 B 扩展 A ,然后覆盖您希望在 B 中具有不同行为的方法。如果您希望通过使用重载来更改 B 中方法的签名,请将 A 中的方法保持为公共。并确保在重载时删除IDE自动添加的@override注解。对于多重继承,你是对的,java不支持多类,所以你必须选择接口来做多重继承

于 2013-06-09T12:05:55.523 回答
0

您可以根据模板模式创建模板

public abstract class templateClass
{
    public abstract void a();
    public abstract void b();
}


public class A extends templateClass
{
    public void a() {

    }

    public void b() {
    }
}

public class B extends A
{

}
于 2013-06-09T12:09:13.680 回答
0

如果类 A 和 B 中的方法 a 行为相似,则可以将参数替换为参数类。这将定义两个 get 方法(param1 和 param2),您需要两个构造函数,一个带有两个参数供 A 类使用,而 B 类只有一个参数(实际上有几种解决方案可以得到相同的结果)。

这样,两个类都可以实现相同的接口:

public interface ABInterface {
    void a(AParams params);
    void b(BParams params);
    ...
}

public class AParams implements ABInterface {

    private int param1;
    private int param2;

    public AParams(int param1, int param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    public AParams(int param1) {
        this.param1 = param1;        
    }

    public int getParam1() {
        return param1;
    }


    public int getParam2() {
        return param2;
    }      
}

public class BParams implements ABInterface {

    private String param1;
    private int param2;

    public BParams(String param1, int param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    public BParams(String param1) {
        this.param1 = param1;        
    }

    public String getParam1() {
        return param1;
    }


    public int getParam2() {
        return param2;
    }      
}


public class A{
    public void a(AParams params) {
        ...
    }
    public void b(BParams params) {
        ...
    }
    ...
  }

public class B{
    public void a(AParams params){
       ... 
    }
    public void b(BParams params){
       ...
    }
    ...
}



public void someMethod() {
    // you can new invoke these methods like this
    a.a(new AParams(1,2));
    b.a(new AParams(1));
    // but also like this, to reuse existing code
    AParams params = new AParams(1,2);
    a.a(params);
    b.a(params);    
}
于 2013-06-11T08:02:01.613 回答
0

Interface并且Composition Over Inheritance可以帮助您解决问题。示例(可能存在一些语法错误,我已经很久没有使用java了):

public interface IFunctionA{
    void a(int param1, int param2);
    void a(int param1);
}

public interface IFunctionB{
    void b(String param1, int param2);
    void b(String param1);
}

public class FunctionA implement IFunctionA{
    public void a(int param1, int param2){
        //do the function
    }
}

// same with FunctionB

public class A{
    private IFunctionA functionA = new FunctionA();
    // same with b

    public void a(int param1, int param2){
        functionA.a(param1, param2);
    }

    //same with function b
}
于 2013-06-10T01:44:45.560 回答