我想不出为什么我不应该这样做,但我想看看我是否遗漏了什么。 如果我有一个实现接口的类,是否有任何理由不让不同类的成员对象实现相同的接口?
public class MemberClass implements MyInterface{
}
public class LargerClass implements MyInterface{
private MemberClass memberClass = new MemberClass;
}
是否会出现任何适用于大多数不适用于标记接口的接口的问题?
答案 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。在某些情况下,这可能会起作用(正如其他人建议的那样,装饰模式......)