我在想,C ++或Java是否有办法做这样的事情
Interface IF1{
....
};
Interface IF2{
....
};
function f(Object o : Implements IF1, IF2){
...
}
表示允许您需要实现接口的类型系统。
答案 0 :(得分:28)
您可以在Java中执行此操作:
public <I extends IF1 & IF2> void methodName(I i){
....
}
这样你强迫我实现你的两个接口,否则它甚至都不会编译。
答案 1 :(得分:11)
在C ++中,我们可以使用std::is_base_of<IF1, Derived>
。这必须与实际派生类型和基本类型一起使用,并且在tempalte
s的帮助下易于使用。
template<typename T>
void f (T obj)
{
static_assert(is_base_of<IF1,T>::value && is_base_of<IF2,T>::value,
"Error: Not implementing proper interfaces.");
...
}
如果T
(派生class
)未实现IF1
和IF2
,则断言将在编译时失败。
答案 2 :(得分:3)
在C ++中你可以做类似的事情:
template <typename T>
void f(T &o)
{
IF1 &i1 = o;
IF2 &i2 = o;
//function body
}
需要带有接口指针的行来确保T实现两个接口(如果不是,则会导致编译器错误)。
答案 3 :(得分:2)
使用提升库(type_traits,enable_if,and_),您可以做一些非常详细的事情。
template <typename T>
typename boost::enable_if< // Check whether
boost::mpl::and_< // Both of the following conditions are met
boost::is_base_of<IF1, T>, // T derives from IF1
boost::is_base_of<IF2, T> // T derives from IF2
>
>
>::type
function(T& t)
{
// ...
}
我的代码中可能存在一些怪癖,但你明白了。
答案 4 :(得分:1)
在java中没有这样的东西,我会添加第三个实现这两个接口的元素并将其用作参数。这对我来说非常有意义,因为第三个对象既不是IF1也不是IF2,只是一个IF3。
interface a {
int foo();
}
interface b {
long foo2();
}
interface c extends a, b {
long daaa();
}
public class TestInterface {
void someMethod (c theThird) {
return;
}
}
这对我来说很有意义。
编辑: 不知道
public <I extends a & b> void methodName(I i){
}
然而我发现它令人困惑。如果一个对象需要实现两个不同的接口,我宁愿拥有第三个接口。恕我直言,它更清洁。
答案 5 :(得分:1)
出了什么问题:
interface IF1IF2 extends IF1, IF2 {}
void f(IF1IF2 o) {
}
为什么过于复杂化?