【问题标题】:C++ Templates & Inheritance in JavaJava 中的 C++ 模板和继承
【发布时间】:2014-04-28 19:33:26
【问题描述】:

我在 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++ AFAIR 相比,Java 在 'generic' 类和接口方面的能力很差。
  • @πάνταῥεῖ 这不是关于能力差,而是错误的设计。
  • @LuiggiMendoza 这只是一个意见。你说的可能是真的......
  • @πάνταῥεῖ 好吧,IMO 你的观点看起来更像是对 Java 的咆哮。如果这不是您的意图,请考虑删除评论或进行相应的编辑。
  • @LuiggiMendoza 这并不是真正的咆哮,而是我更喜欢 c++ 而不是 java 的原因之一。他们在各种问题领域中都有自己的位置。我只是说,直接的元编程并不是 Java 编程的优势之一(尽管这在 Java 环境中根本不那么重要)。

标签: java c++ templates generics inheritance


【解决方案1】:

在 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 根本没有任何意义。

【讨论】:

  • 感谢您的快速回答。但是调用 super.MyMethod() 存在无法直接调用 ParentClass 类型的抽象方法 MyMethod() 的问题。其次,在 C++ 中,调用的方法是模板而不是父方法。
  • 你在正确的轨道上,但是如果你使用他上面的 ParenClass 定义,这会有一些错误......考虑抛光?
  • @LuiggiMendoza 所以 MyClass 将有一个 T 实例并且不再需要扩展 ParentClass?
  • @user3581890 是的,您可以删除它。除非您在 ParentClass 中有可以在 MyClass 中使用的非抽象方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多