java - C++ 模板和 Java 中的继承

标签 java c++ templates generics inheritance

我在 C++ 中有以下类

ParentClass
{
  virtual int MyMethod();
}

class ExistingOne : ParentClass {...}

class ExistingTwo : ParentClass {...}

现在我想创建一个类,它可以扩展现有类中的任何一个并覆盖它们的几个方法,并在某些条件下调用现有类中的方法。

在 C++ 中,这是使用以下方法完成的:

template< class BaseTemplate >
class MyClass : public BaseTemplate
{
  int MyMethod()
  {
    DoSomething();
    return BaseTemplate::MyMethod();
  }
}

这是如何在 Java 中完成的?

目前为止

public abstract class ParentClass
{
  public abstract int MyMethod();
}

public class ExistingOne extends ParentClass {...}

public class ExistingTwo extends ParentClass {...}

public class MyClass<T extends ParentClass>
{
  public int MyMethod()
  {
    DoSomething();
    return T.MyMethod();  //MyMethod must be statically defined? 
  }
}

哦,最后,我无法修改“现有”或父类。

那么这是正确的做法吗?如何解决静态需求?

最佳答案

在 C++ 类定义中,MyClass 扩展了 BaseTemplate。在 Java 示例中,MyClass 没有扩展 ParentClass,因此出现了预期的问题。

在 Java 中,只需将定义更改为:

public class MyClass<T extends ParentClass> extends ParentClass {
    @Override
    public int MyMethod() {
        DoSomething();
        return super.MyMethod();
    }
}

由于 MyMethodParentClass 中是抽象的,这会导致编译器错误。相反,您需要从 ParentClass 的实例调用 MyMethod。这可以通过在 MyClass 中添加一个字段 T t 来解决:

public class MyClass<T extends ParentClass> extends ParentClass {
    T t;
    public MyClass(T t) {
        this.t = t;
    }
    @Override
    public int MyMethod() {
        DoSomething();
        return t.MyMethod();
    }
}

否则,在这里使用泛型和扩展ParentClass将没有任何意义。

关于java - C++ 模板和 Java 中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23349656/

相关文章:

java - Android 程序在调用 getStringArray 后崩溃

c++ - 构造函数中的段错误,但仅限于某些模板参数

java - 需要 Spring 源工具帮助

java - 删除Java字符串中不需要的字符

c++ - 在QT C++中安装MQTT时出错QAbstractSocket

c++ - 泄漏是什么意思?

c++ - 在插件(DLL)中使用 Qt 网络模块?

c++ - std::is_assignable 和 const 指针对象

c++ - 需要一种方法在仅 header 库中拥有任何类型的模板化常量

java - 使用包含 ArrayList 的 HashMap 初始化的 JSONObject 在某些 Android 4 版本上未正确初始化 - 如何修复它?