合并接口,无需合并

时间:2011-10-25 08:38:31

标签: java c++ type-systems

我在想,C ++或Java是否有办法做这样的事情

Interface IF1{
    ....
};

Interface IF2{
    ....
};


function f(Object o : Implements IF1, IF2){
    ...
}

表示允许您需要实现接口的类型系统。

6 个答案:

答案 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)未实现IF1IF2,则断言将在编译时失败。

答案 2 :(得分:3)

在C ++中你可以做类似的事情:

template <typename T>
void f(T &o)
{
    IF1 &i1 = o;
    IF2 &i2 = o;

    //function body
}

需要带有接口指针的行来确保T实现两个接口(如果不是,则会导致编译器错误)。

答案 3 :(得分:2)

使用提升库(type_traitsenable_ifand_),您可以做一些非常详细的事情。

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) {
}

为什么过于复杂化?