Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的泛型继承 在C++中,我们可以写: #include <iostream> class Base1 { public: void test() { std::cout << "Base 1" << std::endl; } }; class Base2 { public: void test() { std::cout << "Base 2" << std::endl; } }; template<class T> class Derived: public T { }; int main() { Derived<Base1> d1; Derived<Base2> d2; d1.test(); d2.test(); } #包括 基类1 { public:void test(){std::cout_Java_C++_Templates_Generics - Fatal编程技术网

java中的泛型继承 在C++中,我们可以写: #include <iostream> class Base1 { public: void test() { std::cout << "Base 1" << std::endl; } }; class Base2 { public: void test() { std::cout << "Base 2" << std::endl; } }; template<class T> class Derived: public T { }; int main() { Derived<Base1> d1; Derived<Base2> d2; d1.test(); d2.test(); } #包括 基类1 { public:void test(){std::cout

java中的泛型继承 在C++中,我们可以写: #include <iostream> class Base1 { public: void test() { std::cout << "Base 1" << std::endl; } }; class Base2 { public: void test() { std::cout << "Base 2" << std::endl; } }; template<class T> class Derived: public T { }; int main() { Derived<Base1> d1; Derived<Base2> d2; d1.test(); d2.test(); } #包括 基类1 { public:void test(){std::cout,java,c++,templates,generics,Java,C++,Templates,Generics,否。C++的模板比Java的泛型更重要。Java中的泛型仅用于确保在编译时正确键入,并且不存在于生成的字节码中-这称为 在我的场景中,我有两个子类,Sprite和AnimatedSprite(这是Sprite的一个子类)。下一步是PhysicalSprite,它将物理添加到Sprite中,但我希望它能够从Sprite和AnimatedSprite继承 继承不是代码重用的唯一形式。这个用例也可以用其他模式来处理,比如简单。考虑一些类似于以下的内容: interface Sprite { ... }

否。C++的模板比Java的泛型更重要。Java中的泛型仅用于确保在编译时正确键入,并且不存在于生成的字节码中-这称为

在我的场景中,我有两个子类,Sprite和AnimatedSprite(这是Sprite的一个子类)。下一步是PhysicalSprite,它将物理添加到Sprite中,但我希望它能够从Sprite和AnimatedSprite继承

继承不是代码重用的唯一形式。这个用例也可以用其他模式来处理,比如简单。考虑一些类似于以下的内容:

interface Sprite { ... }
class StaticSprite implements Sprite { ... }
class AnimatedSprite implements Sprite { ... }

class PhysicalSprite implements Sprite, Physics {
    PhysicalSprite(Sprite inner) { ... }
    ...
}

在这种情况下,PhysicalSprite会将Sprite部分委托给构造函数中提供的某些Sprite实例。然后,它可以自由地为物理部分添加自己的处理。

不,不是以完全相同的方式。但是,如果你告诉我们你到底想做什么,我很确定会有一些优雅的方法来完成。我只是不认为有任何必要对或示例中的模板/泛型。
特别是,看起来
Base1
Base2
可能受益于方法
test
Hm的公共接口。您需要吗?

唉,不需要

<> P>不同于C++的,它可以被认为是为模板的每个实例化发出不同的类定义,泛型类型的所有实例化在java中共享相同的运行时类,因此具有相同的方法定义。泛型(在爪哇中)是编译时,而不是在运行时跟踪。 因此,Java语言规范明确地将类型参数指定为超类或实现的接口:

普通类声明中的可选extends子句指定当前类的直接超类

超级:扩展类类型

其中ClassType是限定或非限定的类名(带有可选的类型参数)

解决办法

  • 如果不需要重写超类调用的方法,请使用decorator模式
  • 为模板的每个实例化生成一个专用的子类。您可以在运行时使用Javassist,或者在编译时使用源代码转换

  • 计算和概念上:+ 1,我不知道C++模板能做到这一点(这可以用来实现Scala中动态混合合成的效果):@丢失faktor:CRTP的谷歌pattern@Armen这不是一个CRTP模式的例子。CRTP有一个一般的结构:代码> A类:B<代码>,这不是OP代码的例子。@ MISSIGO FAKOTRO:我想Armen的观点是,如果你想要C++中的MIXIN,CRTP就是这样做的,而不是这个。我不知道CRTP是否真的模仿S。你说的卡拉,自从“混血”对不同的人来说,不同的东西是不同的。但是我不认为Armen声称这是CRTP。@ Maskfkor正如你所说的,你不知道C++模板能做到这一点,我想你可以读到关于CRTP的有趣的东西,我知道这与OP的问题不太相关。似乎已经有了一些建议(也许很快就会有一些比我更有经验的人来帮忙)。