gpt4 book ai didi

C++/Java 继承 vs. 委托(delegate) vs. 等等

转载 作者:行者123 更新时间:2023-11-30 01:32:58 25 4
gpt4 key购买 nike

我正在创建一个类库,其中包含许多用于可能的自定义的不同选项。例如,您可以设计您的类以使其可以执行 FeatureX(),或者您可以设计您的类以使其可以执行 FeatureY()。

在正常情况下,您只需创建一个接口(interface) IFeatureX 和一个名为 FeatureX 的纯虚方法,以及另一个接口(interface) IFeatureY 和一个名为 FeatureY 的纯虚方法。如果一个类同时具有 FeatureX 和 FeatureY,它可以从两者继承,没问题。

我的问题是,如果一个函数/方法需要一个可以同时执行 FeatureX() 和 FeatureY() 的对象怎么办?我如何表达类型,最好用 C++,但用 Java 的答案也有帮助,以确保 FeatureX 和 FeatureY 都可用?

我是否创建另一个继承自 IFeatureX 和 IFeatureY 的接口(interface) IFeatureXY?好吧...如果只有两个功能我可以摆脱这个。但如果有……10 个功能,可能的接口(interface)数量就会变得非常庞大。

有没有简单的方法来做到这一点?我尝试使用 C++ 模板和委托(delegate)来解决问题,但没有走得太远。我希望有一个简单的解决方案来解决这个问题,而我可能只是忽略了一个。

非常感谢你们提供的任何帮助和建议。

谢谢。

最佳答案

如果你不怕用模板,你可以把你的函数做成模板,然后用SFINAE检查两个接口(interface):

template <class T>
void my_function(const T& data, typename enable_if_c<
is_convertible<T*, IFeatureX*>::value &&
is_convertible<T*, IFeatureY*>::value>::type*=0) {
...
}

这将为扩展两个功能接口(interface)的每种类型创建一个方法(请注意,它不需要 SFINAE 技巧即可工作;不受约束的模板可以工作,但当您传递一个不符合要求的类型时,编译将失败符合要求)。

另一种可能性是创建一个扩展两者的接口(interface) IFeatureXY,并在函数参数中使用它;这有一个缺点,即 确实 实现了两个接口(interface),但不是这个 union 接口(interface)的类型将不能用于此方法。

此外,您可以将两个参数传递给函数,每个接口(interface)一个,并要求它们是指向同一对象的指针;这是脆弱的,但可以通过制作一些模板类来保存两个指针来加强 - 例如。 product_type<IFeatureX*, IFeatureY*> ,它将由所讨论的单个对象初始化,并将包含两种类型。

在 Java 中,您可能可以对有界类型变量执行相同的操作(如果它们允许多个边界;我现在不确定)。

关于C++/Java 继承 vs. 委托(delegate) vs. 等等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com