Подтвердить что ты не робот

Объединение интерфейсов без слияния

Я думал, что на С++ или Java есть способ сделать что-то вроде этого

Interface IF1{
    ....
};

Interface IF2{
    ....
};


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

означает систему типов, которая позволяет требовать реализации интерфейсов.

4b9b3361

Ответ 1

Вы можете сделать это в Java:

public <I extends IF1 & IF2> void methodName(I i){

....

}

Таким образом, вы вынуждаете меня реализовать ваши два интерфейса, иначе он даже не будет компилироваться.

Ответ 2

В С++ мы можем использовать 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, тогда утверждение не будет выполнено во время компиляции.

Ответ 3

в С++ вы можете сделать что-то вроде этого:

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

    //function body
}

с указателем интерфейса необходимы, чтобы гарантировать, что T реализует оба интерфейса (это вызовет ошибку компилятора, если это не так).

Ответ 4

Использование дополнительных библиотек (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)
{
  // ...
}

В моем коде может быть несколько причуд, но вы поняли.

Ответ 5

В 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;
  }
}

это имеет смысл для меня.

EDIT: Не знал о

public <I extends a & b> void methodName(I i){

}

Однако я счел это запутанным. Если для объекта требуется реализовать два разных интерфейса, я предпочитаю иметь третий. ИМХО это чище.

Ответ 6

Что случилось с:

interface IF1IF2 extends IF1, IF2 {}

void f(IF1IF2 o) {
}

Почему слишком сложно?