C ++ / Java的继承和授权对等
-
05-09-2019 - |
题
我创建一个类库与可能的自定义多种不同的选择。例如,你可以设计类,以便它可以执行FeatureX(),也可以设计类,以便它可以执行FeatureY()。
一般情况下,则只需创建称为FeatureX纯虚方法,并用称为FeatureY纯虚拟方法另一个界面IFeatureY接口IFeatureX。如果一个类同时具有FeatureX和FeatureY,它可以从两个继承,没有问题。
我的问题是,如果一个功能/方法需要能够同时执行FeatureX()和FeatureY()对象?我该如何表达一个类型,在C ++中最好,但在Java的答案可以很好的帮助,以确保FeatureX和FeatureY都可用?
我创建一个从IFeatureX和IFeatureY继承了另一个接口IFeatureXY?好吧...如果只有两个功能我可以摆脱这一点。但是,如果有说...... 10个大功能,可能接口的数量变得庞大。
有没有一种简单的方法来做到这一点?我试图用C ++模板和授权解决问题,但没有得到太远。我希望有一个简单的解决方案,这一点,有可能是一个,我只是忽视。
我感谢所有帮助和建议你们有。
感谢。
解决方案
如果你不害怕使用模板,你可以让你的函数模板,并使用SFINAE检查两个接口:
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) {
...
}
这将为每一个同时扩展功能接口(注意,不需要SFINAE伎俩,它的工作类型的方法;不受约束的模板会的工作,只是不能当你通过一个类型,没有编译满足要求)。
另一种可能性是创建一个接口IFeatureXY延伸两者,并且在函数参数使用此;这具有的缺点是其的类型做强>实现这两个接口,但不是该接合界面不会与此方法中使用。
另外,还可以传递两个参数的功能,每一个接口,和需要它们是指向同一个对象;这是脆弱的,但可以通过做一些模板类来保存两个指针硬化 - 例如。 product_type<IFeatureX*, IFeatureY*>
,这将通过单一对象中的问题进行初始化,并且将举行的两种类型。
在Java中,你也许可以做同样的事情有限制类型变量(如果他们允许多重限制,我现在不知道)。
其他提示
做的第一件事就是问,如果你正在尝试做一些事情,不能简单地表示,如果是的话,问自己是否真的值得做?
既然你不能找到你想要的东西,你会需要考虑的选项之间的依赖关系的一个简单的模型。如果可以独立地使用特征量y的特征X,则使它们独立的接口或纯虚类(如适当的语言。)
如果你不能独立地使用它们,使一个类,其中包括二者;问自己,为什么你要FeatureX和FeatureY是独立的接口,因为使用的是模式表明他们毕竟不是独立的。
虽然有方法可以添加不同的完全功能,你可能要考虑一下这些新增的功能范围。他们要涉及到你的主类库? (有人会认为如果它们不是它们不应该是它的一部分)
如果他们有足够的共同点来令添加功能,你可以找类似的装饰图案( HTTP ://en.wikipedia.org/wiki/Decorator_pattern )。它可以让你避开一些靠不住的问题与做这样的事情。
如果你想加时赛做它在C ++中,关于多重继承什么?
也许你正被过于细粒度。考虑一个数字类 - 你可以执行乘法,除法,加法,减法,等等。但是,你不会为每个这些操作的独立的接口 - 你会创建一个名为SupportsArithmetic(或其他),涵盖他们都一个接口。 p>
WCF具有非常好的图案如何确定是否一些对象支持使用IExtensionCollection<T>.Find<E>()
一些接口(或类)。 IExtensionCollection 。
IFeatureX feature = argument.Find<IFeatureX>();
if (feature != null)
{
// Find() returned an instance so there is an implementation
// of IFeatureX available
feature.FeatureX();
}
此方式,您可以查询您的对象有些inteface。类似的方法在COM +应用于的IUnknown ::的QueryInterface( )。
为什么你需要的接口?使用的模板:
template< typename T >
void some_function( const T& t )
{
// use featureX functions
t.fetatureX();
// use featureY functions
t.featureY();
}
用法:
SomeClass x; // object with only X feature
some_function( x ); // compile time error, because featureY() doesn't exists