Ответ 1
Вы можете сделать это в Java:
public <I extends IF1 & IF2> void methodName(I i){
....
}
Таким образом, вы вынуждаете меня реализовать ваши два интерфейса, иначе он даже не будет компилироваться.
Я думал, что на С++ или Java есть способ сделать что-то вроде этого
Interface IF1{
....
};
Interface IF2{
....
};
function f(Object o : Implements IF1, IF2){
...
}
означает систему типов, которая позволяет требовать реализации интерфейсов.
Вы можете сделать это в Java:
public <I extends IF1 & IF2> void methodName(I i){
....
}
Таким образом, вы вынуждаете меня реализовать ваши два интерфейса, иначе он даже не будет компилироваться.
В С++ мы можем использовать 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
, тогда утверждение не будет выполнено во время компиляции.
в С++ вы можете сделать что-то вроде этого:
template <typename T>
void f(T &o)
{
IF1 &i1 = o;
IF2 &i2 = o;
//function body
}
с указателем интерфейса необходимы, чтобы гарантировать, что T реализует оба интерфейса (это вызовет ошибку компилятора, если это не так).
Использование дополнительных библиотек (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)
{
// ...
}
В моем коде может быть несколько причуд, но вы поняли.
В 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){
}
Однако я счел это запутанным. Если для объекта требуется реализовать два разных интерфейса, я предпочитаю иметь третий. ИМХО это чище.
Что случилось с:
interface IF1IF2 extends IF1, IF2 {}
void f(IF1IF2 o) {
}
Почему слишком сложно?