合并接口,不合并

发布于 2024-12-12 04:41:28 字数 198 浏览 0 评论 0原文

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

Interface IF1{
    ....
};

Interface IF2{
    ....
};


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

意味着类型系统允许您要求实现接口。

I was thinking, does C++ or Java have a way to do something like this

Interface IF1{
    ....
};

Interface IF2{
    ....
};


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

meaning a typesystem that allows you to require implementation of interfaces.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

给妤﹃绝世温柔 2024-12-19 04:41:28

您可以在 Java 中执行此操作:

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

....

}

这样,您可以强制 I 实现您的两个接口,否则它甚至无法编译。

You can do this in Java:

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

....

}

This way, you force I to implement your two interfaces, otherwise it won't even compile.

迷雾森÷林ヴ 2024-12-19 04:41:28

在 C++ 中,我们可以使用 std::is_base_of。这必须与实际的派生类型和基类型一起使用,并且在 tempalte 的帮助下将很容易使用。

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

In C++, we can use std::is_base_of<IF1, Derived>. This has to be used with the actual derived and base type and will be easy to use with the help of tempaltes.

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.");
  ...
}

If T (a derived class) is not implementing IF1 and IF2, then the assertion will fail at compile time.

空名 2024-12-19 04:41:28

在 C++ 中,你可以这样做:

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

    //function body
}

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

in C++ you can do something like that:

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

    //function body
}

lines with interface pointer are needed to ensure that T implements both interfaces (it will cause compiler error if it is not).

慢慢从新开始 2024-12-19 04:41:28

使用 boost 库 (type_traits, < a href="http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html" rel="nofollow">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)
{
  // ...
}

我的代码中可能存在一些怪癖,但您明白了。

Using boost libraries (type_traits, enable_if, and_), you can do something quite elaborate.

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

There may be a few quirks here and there in my code, but you get the idea.

妄司 2024-12-19 04:41:28

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

}

但是我发现它令人困惑。如果一个对象需要实现两个不同的接口,我更喜欢第三个。恕我直言,它更干净。

In java there's nothing like this, I would add a third element implementing the two interfaces and use it as a parameter. And this will makes perfect sense to me, because the third object is neither an IF1 nor an IF2, is just an IF3.

interface a {
  int foo();
}


interface b {
  long foo2();
}

interface c extends a, b {
  long daaa();
}

public class TestInterface {

  void someMethod (c theThird) {
    return;
  }
}

this makes sense to me.

EDIT:
Wasn't aware of

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

}

However I found it confusing. If an object needs to implement two different Interfaces I prefer to have a third one. IMHO it's cleaner.

青丝拂面 2024-12-19 04:41:28

有什么问题:

interface IF1IF2 extends IF1, IF2 {}

void f(IF1IF2 o) {
}

为什么要把事情复杂化?

What's wrong with:

interface IF1IF2 extends IF1, IF2 {}

void f(IF1IF2 o) {
}

Why overcomplicate things?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文