【问题标题】:Class implementing interface containing same interface类实现包含相同接口的接口
【发布时间】:2014-03-31 09:15:37
【问题描述】:

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

public class MemberClass implements MyInterface{
}

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

是否存在适用于大多数接口但不适用于标记接口的问题?

【问题讨论】:

    标签: java class interface


    【解决方案1】:

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

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

    【讨论】:

    • 我正在考虑一个 Animatable 对象,它包含两个实现接口 VisibleObject 的动画对象。 VisObj 具有用于任何应绘制的抽象方法。
    【解决方案2】:

    这很好,通常用于委托,例如在装饰器模式中。虽然它实际上没有使用接口(而是使用抽象基类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 有效地做到了这一点......)

    【讨论】:

      【解决方案3】:

      这是有效的,实际上是decorator pattern 的经典示例,这里您的LargerClass 正在装饰MemberClass

      【讨论】:

        【解决方案4】:

        以装饰者模式为例。

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

        【讨论】:

          【解决方案5】:

          这不是问题。此外,还有一个著名的设计模式,名为 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
              }
          }
          

          【讨论】:

            【解决方案6】:

            编程/语法是的,你可以做到。但从“设计”的角度来看,是不是?

            假设你有一个 Animal 接口并且你的 Dog 类实现了它。现在,如果您有 2 个类 Dog 和 Cat 实现相同的接口,则不能在另一个类中包含 Dog/Cat。在某些情况下,这可能会起作用(正如其他人的建议,装饰器模式..)

            【讨论】:

              猜你喜欢
              • 2019-04-08
              • 1970-01-01
              • 2016-10-07
              • 1970-01-01
              • 1970-01-01
              • 2019-08-22
              • 2014-10-25
              • 2021-10-18
              • 2022-08-17
              相关资源
              最近更新 更多