C++;模板及;Java中的继承
我有以下C语言的课程++C++;模板及;Java中的继承,java,c++,templates,generics,inheritance,Java,C++,Templates,Generics,Inheritance,我有以下C语言的课程++ ParentClass { virtual int MyMethod(); } class ExistingOne : ParentClass {...} class ExistingTwo : ParentClass {...} 现在我想创建一个类,它可以扩展现有的任何一个类,重写它们的两个方法,并在某些条件下调用现有类中的一个方法 在C++中,这是用下面的方法来完成的: template< class BaseTemplate > class
ParentClass
{
virtual int MyMethod();
}
class ExistingOne : ParentClass {...}
class ExistingTwo : ParentClass {...}
现在我想创建一个类,它可以扩展现有的任何一个类,重写它们的两个方法,并在某些条件下调用现有类中的一个方法
在C++中,这是用下面的方法来完成的:
template< class BaseTemplate >
class MyClass : public BaseTemplate
{
int MyMethod()
{
DoSomething();
return BaseTemplate::MyMethod();
}
}
template
类MyClass:公共基模板
{
int MyMethod()
{
DoSomething();
返回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?
}
}
公共抽象类父类
{
公共抽象int MyMethod();
}
公共类ExistingOne扩展父类{…}
公共类ExistingTwo扩展父类{…}
公共类MyClass
{
公共int-MyMethod()
{
DoSomething();
return T.MyMethod();//MyMethod必须是静态定义的吗?
}
}
最后,我不能修改“现有”或父类
那么这是正确的方法吗?在C++类定义中,如何解决静态需求?< P>,<代码> MyClass <代码>扩展<代码> BaseTePoe< /代码>。在Java示例中,
MyClass
没有扩展ParentClass
,因此得到了预期的问题
在Java中,只需将定义更改为:
public class MyClass<T extends ParentClass> extends ParentClass {
@Override
public int MyMethod() {
DoSomething();
return super.MyMethod();
}
}
否则,使用泛型和扩展<代码> ParentClass <代码>根本没有任何意义。
java与“C++”AfAIR相比,对“泛型”类和接口的理解能力很差。ῥεῖ 这不是因为能力差,这只是错误的设计。@LuiggiMendoza,这只是一种观点。你说的很可能是真的…@πάνταῥεῖ 嗯,在我看来,你的观点更像是对Java的咆哮。如果这不是你的意图,请考虑删除评论或编辑相应的。@ LuiggiMendoza它不是真正的咆哮,而是我喜欢C++的java的原因之一。他们在不同的问题领域有自己的位置。我只是说,简单的元编程并不是java编程的优势之一(尽管这在java环境中根本不那么重要)。但是,调用super.MyMethod()会出现无法直接调用ParentClass类型的抽象方法MyMethod()的问题。除此之外,在C++中,调用的方法将不是模板的父方法。您在正确的轨道上,但是如果您使用上面的PARNENORE定义,则会有一些错误。考虑抛光吗?@ LuiggimimZa,所以MyC类将有一个T的实例,而不需要再扩展父类了?@ USE3581890是的,您可以移除它。除非在ParentClass
中有可以在MyClass
中使用的非抽象方法。
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();
}
}