包含相同接口的类实现接口

时间:2014-03-31 09:15:37

标签: java class interface

我想不出为什么我不应该这样做,但我想看看我是否遗漏了什么。 如果我有一个实现接口的类,是否有任何理由不让不同类的成员对象实现相同的接口?

public class MemberClass implements MyInterface{
}

public class LargerClass implements MyInterface{
    private MemberClass memberClass = new MemberClass;
}

是否会出现任何适用于大多数不适用于标记接口的接口的问题?

6 个答案:

答案 0 :(得分:4)

我认为没有问题,只有两个类碰巧实现了相同的接口。

我喜欢听到使这样的事情成为必要的设计理由,但我不相信编译器或运行时会抱怨。

答案 1 :(得分:2)

这绝对没问题,经常用于授权,例如在装饰模式中。虽然它实际上并没有使用 interfaces (而是使用抽象基类Stream),但BufferedStream就是一个例子。

或者例如,您可以创建“连接可迭代”:

public class Concatenation<T> : IEnumerable<T>
{
    private readonly IEnumerable<T> first;
    private readonly IEnumerable<T> second;

    public Concatenation(IEnumerable<T> first, IEnumerable<T> second)
    {
        this.first = first;
        this.second = second;
    }

    public IEnumerator<T> GetEnumerator()
    {
        // Implicitly calls first.GetEnumerator()
        foreach (T item in first)
        {
            yield return item;
        }
        // Implicitly calls second.GetEnumerator()
        foreach (T item in second)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

(LINQ中Enumerable.Concat有效地做到了这一点......)

答案 2 :(得分:0)

这是有效的,实际上是decorator pattern的典型示例,其中LargerClass正在装饰MemberClass

答案 3 :(得分:0)

以装饰模式为例。

在这种模式中,你有一个实现接口的类,它与包含的对象实现的接口完全相同。

答案 4 :(得分:0)

这不是问题。此外,还有一个名为Wrapper(或Decorator)的着名设计模式,其定义如下:

public interface Business {
    public void doSomething();
}


public class BusinessWrapper implements Business {
    private Business wrapped;

    public void doSomething() {
        // probably do something before
        wrapped.doSomething();
        // probably do something after
    }
}

答案 5 :(得分:0)

编程/语法是,你可以做到。但是来自&#34; Design&#34;是的,是不是?

假设您有一个Animal接口,而Dog类实现了它。现在,如果你有两个类Dog和Cat实现相同的界面,你就不能在另一个类中拥有Dog / Cat。在某些情况下,这可能会起作用(正如其他人建议的那样,装饰模式......)