假设我有某种类,它代表算法,这种算法需要一些特殊的数据(例如某些成员函数)。
在示例中我们可以这样做:
<<interface>>
+------------------------+ +------------+
| Algorithm | <<uses>> | Data |
+------------------------+-------------->+------------+
| + doJob(inData : Data) | | +getPixel()|
+------------------------+ +------------+
每次想要使用类算法时,我们都可以强制Algorithm的用户继承Data。我们也可以做一个模板:
template<typename T>
doJob(T&& inputData){
//implementation
}
(没有类来简化事情的功能)
我们强制我们的客户端创建具有正确名称方法的类,但是我们不会让他实现我们的抽象类(不同语言的接口)(可能会有更好的性能吗?)
我的问题是:
哪种方法更好?
在选择时,我们应该以模板方式还是以抽象方式在库中实现?
标准是否有理由不定义一些标准的“接口”,如std :: container或std :: factory(只是示例)?
答案 0 :(得分:1)
你实际上有一个以上的问题,所以,让我们逐一回答:
哪种方法更好?
一般来说,两者都不是更好。每个人都有优点和缺点。但是你确实得到了一个有趣的观点:在更抽象的层面上,这两者几乎是一样的。
当我们选择时,我们应该以模板方式或抽象方式在库中实现?
使用模板:
一般来说,执行速度更快。它可以更多更快,并且可以完成许多内联,然后进行优化。 OTOH具有先进的去虚拟化编译器/链接器以及无法进行大量内联/优化的功能,您可能会获得几乎相同的速度。
编译时间较慢。它可能很多更慢,特别是如果你去&#34;花哨的模板 - 元编程&#34;方式。
更糟糕的编译错误。他们可能很多更糟糕,特别是如果你去了'#34;花式模板 - 元编程&#34;办法。当C ++获得对概念的支持时,应该能够避免这种情况。
如果您仔细设计,可以提高型号的安全性。 OTOH,如果你不小心,你最终会比Smalltalk更糟糕的鸭子打字。概念也是一种可以在这里提供帮助的工具。
使用虚拟功能/接口,您将获得:
标准是否有理由不定义某些标准&#34;接口&#34;比如std :: container或std :: factory(只是例子)?
人们可以找到很多&#34;低级&#34;原因,我猜,但根本原因是表现。也就是说,STL被设计为&#34;尽可能快&#34;并且将一些(有用的)接口放在顶部,如果它&#34;现在几乎不可能。
答案 1 :(得分:0)
这似乎是一个基于意见的问题。强迫客户履行义务的最好方法是让他签订合同,将联系人作为接口。