Alb*_*ore 5 c++ java generics inheritance templates
我听说很多人都说C++模板非常强大.我似乎仍然不理解使用它们而不是使用继承的优点.
因为我主要是一个Java开发人员,认为泛型和模板是同一个东西,但相应的维基百科:
虽然C++模板,Java泛型和.NET泛型通常被认为是相似的,但泛型只是模仿C++模板的基本行为.
我也想知道是否使用模板,人们可以使用类是不是混淆代码?
Jam*_*nze 14
模板和继承可以完成不同的角色,在您可以选择它们的地方相当少见.一个非常简单的描述应该是模板为不同的接口提供通用实现,其中继承为不同的实现提供了通用接口.在通常的角色中,模板在编译时对类型系统强制执行不变量; 考虑一些预模板库,其中a Vector只能包含Object*,并且所有内容都必须从中派生出来Object(并且你必须包装类似的东西int).int在向量中插入并尝试读取a
double是运行时错误(或简单的未定义行为),而不是编译时错误.
我不同意维基百科的引用:从技术上讲,C++模板和Java模板几乎是不相关的.Java模板的目标是在类型系统上提供不变量的编译时强制,这也是C++模板的重要用途之一,但使用的机制完全不相关,C++模板也可用于其他目的.
最后,如果您使用的模板只有一个简单的类可以完成这项工作,那么您就是在滥用模板.仅仅因为C++有模板并不意味着你应该让每个类和函数都成为模板.
Pup*_*ppy 13
模板在编译时发生.继承发生在运行时.你可以在编译时捕获模板的错误,你必须对继承进行单元测试(然后希望你不要错过它们).此外,模板比继承更清晰,更流畅.
考虑一下Java中List的简单情况.如果你有一个只应包含的List,我不知道,客户,但如果实际上它拥有一堆Object引用,你不能保证它不包含一堆动物或DatabaseConnections,当你得到它,你必须投,它可以扔.泛型保证正确的结果,不需要演员表.如果你写了一个试图在这里插入一些不属于的东西的bug,你的编译器会抛出一个拟合.这种安全级别远远高于多态性所能提供的级别.
此外,模板(在C++中)可以接受除类型之外的参数,例如整数类型,可以执行编译时类型内省,以及那种事情.模板的可能性大大超过了继承的可能性,而且它也更加安全和快捷.
最后,使用模板,您不必显式继承.如果我想提供,我是否必须继承Addable operator+?不,模板会自动提取.这比必须明确指定我可以继承的每个功能更加可维护,因为当新库出现时,我不必更改我的代码以继承其Addable接口.在C++中,我不必从Callable接口继承允许使用boost::function,即使它是在写入函数对象之后开发的.Java永远不会用继承做到这一点.你怎么可能开发一个可以处理可变数量的参数而没有泛型的类?写一个Callable1,Callable2,Callable3接口?
考虑另一个简单示例.假设我想将两个对象一起添加,然后用最终对象减去结果.如果您有一个IAddable接口,您怎么可能指定加法运算的结果是可以减去的?并且可以减少什么 - 我当然希望这不是另一个参数?你基本上必须为每个复杂的用例编写一个新的接口.另一方面,模板一直保持其类型信息,因此如果我执行的操作不止一次,结果就不会丢失信息.
这些基本上与静态和动态类型相同,有效地,模板是静态的,继承是动态的.静态类型比动态类型明显更快且更不容易出错.