当前位置: 首页 > 知识库问答 >
问题:

如何使用两个具有相同方法但没有父类的类?

司寇望
2023-03-14
public class ClassB {
    public ClassB(...) {}
    public int update(...) {}
    public String query(...) {}
    .
    .
    .
}

因此,上述结构在ClassA中也同样存在。

假设我想编码2个其他类ClassC(使用ClassA的实例)和ClassD(使用ClassB的实例)。除了ClassA和ClassB的实例之外,ClassC和ClassD的代码完全相同。

public class ClassC {
    ClassA tmp;
    public ClassC(...) {
        tmp = new ClassA(...);
    }
    public void doSomething(...) {
        tmp.update(...);
        tmp.query(...);
    }
    .
    .
    .
}
public class ClassD {
    ClassB tmp;
    public ClassD(...) {
        tmp = new ClassB(...);
    }
    public void doSomething(...) {
        tmp.update(...);
        tmp.query(...);
    }
    .
    .
    .
}

从示例中可以看出,ClassC和ClassD具有相同的功能,但对tmp使用了不同的类

public abstract class ClassE {
    public ClassE(...) {}
    public abstract int update(...);
    public abstract String query(...);
    public void doSomething(...) {
        tmp.update(...);
        tmp.query(...);
    }
    .
    .
    .
}
public class ClassC extends ClassE {
    ClassA tmp;
    public ClassC(...) {
        tmp = new ClassA(...);
    }
    public int update(...) {
        return tmp.update(...);
    }
    public String query(...) {
        return tmp.query()
    }
    .
    .
    .
}
public class ClassD extends ClassE {
    ClassB tmp;
    public ClassD(...) {
        tmp = new ClassB(...);
    }
    public int update(...) {
        return tmp.update(...);
    }
    public String query(...) {
        return tmp.query()
    }
    .
    .
    .
}

共有1个答案

萧德庸
2023-03-14

您可以创建接口,而不是抽象类。通用接口。其内容如下:

public interface class ClassE <G> {
     int update(G attr);
     String query(G attr);
     void doSomething(G attr);
    
 }

必须创建类实现:

public class  ImplementClassA implements ClassE<ClassA> {

  public  int update(ClassA attr){
  .
  .
  .
  }
  public  String query(ClassA attr){
  .
  .
  .
  }
  public void doSomething(ClassA attr){
  .
  .
  .
  }
  
}  



public class  ImplementClassB implements ClassE<ClassB> {

  public  int update(ClassB attr){
  .
  .
  .
  }
  public  String query(ClassB attr){
  .
  .
  .
  }
  public void doSomething(ClassB attr){
  .
  .
  .
  }
  
}

在c类中,可以使用接口。在classc中,可以使用接口,因此可以传递所需类型的实例,无论是classA还是ClassB的实现

public class ClassC <G> {

    private ClassE tmp;


    public ClassC(ClassE tmp) {
        this.tmp = tmp;
    }
    public int update(G attr) {
        return tmp.update(attr);
    }
    public String query(G attr) {
        return tmp.query(attr)
    }
    .
    .
    .

}

ClassC<ClassA> teste = new ClassC<ClassA>(new ImplementClassA());
ClassA save = new ClassA();
teste.update(save);
ClassC<ClassB> teste2 = new ClassC<ClassB>(new ImplementClassB());
ClassB save2 = new ClassB();
teste2.update(save2);
 类似资料:
  • 我改变了切入点的顺序,它总是排在第二位。关于如何解决这个问题有什么想法吗? 更新 一旦我发布了这个问题,我就有了一个想法。我这样更改了切入点: 现在异常消失了,但仍然有一个小问题(我想这个问题更容易解决):因为ArrayList实现了可序列化,所以至少在我使用ArrayList的测试用例中,两个切入点都被执行了。 我将对此进行研究,并发布我的发现,但也感谢您的帮助;) 我将代码改为只使用一个切入点

  • 我正在尝试创建restful API(使用Spring Boot v2.0.0.Release),我希望有一个endpoint,但我希望有两种可能的用途: 首先,这可能吗?其次,有人有代码示例吗? 非常感谢你的帮助

  • 问题内容: 如何在不同的程序包中访问两个具有相同名称的类? 和 所有这些都在同一个班级 谢谢。 问题答案: 您将必须导入另一个,您将编写完全合格的路径 例如在您的代码中:

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 我花了一些时间在互联网上寻找这个问题的答案,我也试着在SO的所有地方寻找答案,但我想我没有正确的术语……请原谅,如果这是某个已知问题的重复,我很乐意删除我的帖子,改为引用该帖子! 无论如何,我试图在Matplotlib中的同一图形上绘制两个直方图。我的两个数据源是包含 500 个元素的列表。要说明我面临的问题,请参阅下图: 如您所见,在默认参数下,直方图具有不均匀的条块大小,即使条块的数量是相同的

  • 我有以下两种方法: 正如您所看到的,主体是相同的——我可以通过方法参数传递文件名。这些方法从JSON文件加载内容。他们身体上唯一的显著区别是所应用的课程类型<我想到了类似的事情: 但是我有错误: 我的dto-例如配置: 有可能在上述情况下应用泛型吗<对不起,如果这个问题没有意义,因为我只是在学习泛型