如何在C+中管理大量接口+;还是Java 我在C++中面临以下问题(但是java的回答也会有帮助)。我正在创建大量类似的类,以及大量对这些类进行分析的函数。假设类是C1,…,Cn,函数是f1,…,fn。每个函数都要求它所操作的类具有某些属性,这些属性是p1、…、pn的子集

如何在C+中管理大量接口+;还是Java 我在C++中面临以下问题(但是java的回答也会有帮助)。我正在创建大量类似的类,以及大量对这些类进行分析的函数。假设类是C1,…,Cn,函数是f1,…,fn。每个函数都要求它所操作的类具有某些属性,这些属性是p1、…、pn的子集,java,c++,oop,inheritance,interface,Java,C++,Oop,Inheritance,Interface,作为一个具体的例子,让我们说 C1是p1、p2和p3 C2是p1和p2 C3是p2和p3 C4只是一个p1 我有很多功能 f1需要的东西是p1,p2,p3 f2需要p1,p2 f3需要的是p2,p3 f4需要的东西是p1 现在我希望f1能够使用C1,f2能够使用C2和C1,f3能够使用C3和C1,f4能够使用C1,C2,C3 基本上,不同的功能有不同的、重叠的但非架构性的需求。我想不出一个继承范例能够大规模地解决这个问题(有4个以上的类/函数),而没有下面这样可怕的东西 class p1 cla

作为一个具体的例子,让我们说

C1是p1、p2和p3

C2是p1和p2

C3是p2和p3

C4只是一个p1

我有很多功能

f1需要的东西是p1,p2,p3

f2需要p1,p2

f3需要的是p2,p3

f4需要的东西是p1

现在我希望f1能够使用C1,f2能够使用C2和C1,f3能够使用C3和C1,f4能够使用C1,C2,C3

基本上,不同的功能有不同的、重叠的但非架构性的需求。我想不出一个继承范例能够大规模地解决这个问题(有4个以上的类/函数),而没有下面这样可怕的东西

class p1
class p2
class p3

class p1andp2 : p1, p2
class p2andp3 : p2, p3
class p1andp2andp3 : p1, p2, p3

C1:public p1, p2
//some code
C2:public p1, p2, p3
//EXACTLY THE SAME CODE
C3:public p1
//EXACTLY THE SAME CODE
实现这个场景有希望吗


非常感谢:)

您可以让函数对属性类型使用
static\u cast
,以实现编译时验证参数是否为所需类型。您不需要
类p1和p2以及p3:p1、p2、p3
或类似的类(我假设您的问题是从中推导C1、C2和C3)

structp1{};
结构P2{};
结构P3{};
结构C1:P1,P2,P3{};
结构C2:P2,P3{};
结构C3:P1,P3{};
模板
无效fa(常数P&P)
{
//无论你需要什么。。。
//常数P1和P1=静态铸件(p);
常数P2和P2=静态施法(p);
常数P3和P3=静态投影(p);
//根据需要使用pns。。。
}
int main()
{
fa(C2());
}

此外,“完全相同的代码”的资本化是否意味着对该代码进行保理的抗议或协助请求?如果是这样的话,您能否显示哪种代码会重复…?

请考虑查看标准模板库的体系结构。该库通过使用模板(而不是继承)将函数与类解耦,从而解决了一组类似的算法


STL有许多存储数据的方法。排序函数不是为每个数据结构提供单独的排序函数,而是将迭代器引入符合预期接口的数据结构中。这样,代码复杂度从多项式(N个数据结构)*(M个算法)降低到线性(N个数据结构)+(M个算法)+(K个迭代器)。

感谢大家的评论/反馈。我以前不知道铸造,所以这对我的学习很有帮助。“Tony D”,经过一些研究,在我看来,出于这个目的,使用动态_-cast比使用静态_-cast更安全

我认为对我来说最好的答案(经过更多的研究)是虚拟继承。我可以做到以下几点:

class p1
class p2
class p3

class p1andp2 : virtual p1, virtual p2
class p2andp3 : virtual p2, virtual p3
class p1andp2andp3 : virtual p1, virtual p2, virtual p3

C1 : p1, p2, p3, p1andp2, p2andp3, p1andp2andp3

f1(p1andp2andp3 input);
f2(p1andp2 input);

该策略的复杂性为O(xy),x为函数所需的不同签名数,y为具有该签名的类的平均数。这不是线性的,但我不必使用模板


如果必须使用模板,那么static_assert似乎是一个有用的关键字:

我认为更多信息会有所帮助。你说的“财产”是什么意思?这些是类实现的方法吗?它们是什么类型的?它们只是随机性质吗?为什么函数依赖于这些属性?您是使用属性来决定要调用哪些函数,还是这只是一个类型安全问题?这里有很多可能的答案,比如标记接口、模板/泛型、访问者模式或双重分派,或者简单枚举,但是如果没有更多的信息,很难说什么方法是有意义的。
class p1
class p2
class p3

class p1andp2 : virtual p1, virtual p2
class p2andp3 : virtual p2, virtual p3
class p1andp2andp3 : virtual p1, virtual p2, virtual p3

C1 : p1, p2, p3, p1andp2, p2andp3, p1andp2andp3

f1(p1andp2andp3 input);
f2(p1andp2 input);