我创建一个类库与可能的自定义多种不同的选择。例如,你可以设计类,以便它可以执行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(或其他),涵盖他们都一个接口

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top