我在 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();
}
}
由于 MyMethod
在 ParentClass
中是抽象的,这会导致编译器错误。相反,您需要从 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/