【问题标题】:How do you deal when the implementation for an interface method is the same for some classes?当某些类的接口方法的实现相同时,您如何处理?
【发布时间】:2014-07-25 07:52:38
【问题描述】:

假设我已经使用方法 foo 和 bar 定义了接口 ISomeInterface。
例如。

public interface ISomeInterface {  
    public void foo();  
    public void bar();  
} 

假设我有 A 和 B 类,对它们来说,实现接口是有意义的。但是为foo() 设置不同的实现也没有任何意义。
考虑到从 B 派生 A 或从 A 派生 B 是不正确/奇怪的,这种设计是否有标准的编码实践?
我假设我可以创建一些实用程序类来实现foo() 并将其作为委托调用,但我想知道是否可以以不同方式处理整个结构

更新:
为了充分理解我的问题,我偶然发现了这个:http://perlbuzz.com/2010/07/why-roles-in-perl-are-awesome.html,我试图了解我们在 Java 中使用传统 OO 概念时是否缺少此功能

【问题讨论】:

  • 你为什么不把你的接口变成一个抽象类并为 foo() 提供一个实现?
  • 如果您使用的是 Java8,您可以提供 default implementation in the interface,或者您可以始终遵循敏捷宣言并通过创建可以执行该功能的协作者来选择 has-A 关系。 A 和 B 将与接口具有 is-A 关系,与协作者具有 has-A 关系。
  • @Dan Temple:查看更新
  • 如果我理解正确,您正在寻找一种在 Java 中使用角色来表示多重继承的方法。正如文章中所指出的,Java 不支持多重继承,因此抽象类在这里不会有太大帮助。但是您可以实现多个接口,这可能有助于您获得角色的感觉。我想知道 Java8 中的默认方法是否实际上与 Perl5 中的默认实现相比较。
  • @DanTemple:我主要担心的是,老实说,我认为不需要“角色”。所以我想知道这是否是我们在 Java 中使用 OO 时的遗漏

标签: java class oop design-patterns interface


【解决方案1】:

您的编辑表明您的真正问题是:“Java 中的 Perl 角色是否有等价物?”

由于 Java 8 在接口中引入了default 方法,具有默认方法的接口似乎非常适合角色。特别是,您可以在示例中做您想做的事情:为foo() 提供默认实现:

interface ISomeInterface {
    public default void foo(){ /* your default impl goes here */}
    public void bar(); // Abstract, must be implemented by subclasses
}

class A implements ISomeInterface {
    // must only implement bar, can reuse foo's default impl
}

class B implements ISomeInterface {
    // must only implement bar, can reuse foo's default impl
}

如果我缺少有关角色的功能,请告诉我。否则,我认为 Java8 接口可以很好地替代角色。

【讨论】:

  • 你是对的。我主要担心的是,老实说,我认为不需要“角色”。所以我想知道这是否是我们在 Java 中使用 OO 时的遗漏
  • @Jim:老实说,对我来说,角色看起来很像通常的特征(即与实现的接口)。提倡角色完全不同的作者只是试图给他们另一种“外观和感觉”,但在他们的核心,我认为与通常的多继承没有太大区别......
【解决方案2】:

决定把我的评论变成答案:

您可以使用抽象类而不是接口:

    public abstract class FooBar {  
        public void foo(){
       //your implementation goes here  
        }

        abstract void bar();  
    } 

    public class A extends FooBar{

        @Override
        public void bar(){

        }
    }

【讨论】:

    【解决方案3】:

    为什么不这样:

    public class abstract SomeAbstractClass {  
        public void foo(){
           //implementation
        }  
        public abstract void bar();  
    } 
    
    class A extends SomeAbstractClass {
    
    }
    
    class B extends SomeAbstractClass {
    
    }
    

    【讨论】:

      【解决方案4】:
      public abstract class SomeClass implements ISomeInterface {
          public void foo() {
              // I do stuff..
          }
      }
      
      public class A extends SomeClass {
          public void bar() {
              // A specific impl. of bar..
          }
      }
      
      public class B extends SomeClass {
          public void bar() {
              // B specific impl. of bar..
          }
      }
      

      【讨论】:

        【解决方案5】:

        或者,如果您不想通过扩展抽象类来捆绑 A 和 B,则可以使用组合。如果您要将FooImpl 作为构造函数的一部分注入,这也提供了在运行时更改IFoo 行为的灵活性。在这个例子中,为了简洁起见,我只是硬连线了FooImpl

        public class B implements ISomeInterface {
        
            private IFoo foo = new FooImpl();
        
            public void foo() {
                foo.doSomethingFooey();
            }
        
            public void bar() {
                // B specific implementation        
            }
        }
        
        public class A implements ISomeInterface {
        
            private IFoo foo = new FooImpl();
        
            public void foo() {
                foo.doSomethingFooey();
            }
        
            public void bar() {
                // A specific implementation
            }
        }
        

        【讨论】:

        • 您将实现其他接口并提供类似于IFoo + FooImpl(如上所示)的帮助类,其中将包含所需行为的实现
        • 这是否意味着需要此功能并且缺少此功能?因为根据您的建议,我需要编写一个全新的辅助类层次结构
        • 不是没有。Java 我们是一种静态类型的语言,因此编译器需要知道一个类支持一个方法。实现一个接口是java表达这一点的方式。创建大量特定的小类实际上是很好的 OO 设计(想想单一职责原则)。失败了,也许您的设计更适合功能性方法
        猜你喜欢
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多