为对象或行为/行为创建接口?

时间:2009-09-05 02:38:12

标签: oop architecture interface naming

创建界面时,请根据行为创建界面,遵循-able标准,例如

interface Comparable
interface Enumerable
interface Listable
interface Talkable
interface Thinkable

或基于对象,例如

interface Comparator
interface Enumerator
interface List
interface Human

为什么?

更新

此问题与命名约定(-able后缀或I-前缀)无关。这是关于界面的设计意图及其影响,包括: -

  1. 灵活性
  2. 复杂/简洁
  3. 可维护性
  4. 例如,如果我需要实现不同的功能,通过可行的方式,我可以将我的类声明为

    public class Man implements Talkable, Thinkable, Laughable
    public class Woman implements Talkable, Thinkable, Laughable
    

    另一方面,如果我们基于对象创建接口,我们可以将其用作

    public class Man implements Human
    public class Woman implements Human
    

    我们也可以将它用于多态目的。

    Human man = new Man();
    

3 个答案:

答案 0 :(得分:4)

接口与具体类的作用无关。它们更多地是关于客户需要什么,以及什么是可替代的,取代客户需要的东西。例如,不是尝试从Man类中提取接口,而是专注于使用Man类的其中一个类。它有什么作用?也许这是一个Conversation课程,希望让事情相互交流。如果你给了它两个Man类,它可以在它们上面调用talk()。但是如果你想要它更灵活,你可以抽象出它的作用的概念 - 使事情说话,并让它使用Talkable接口(例如)。当您在此Talkable课程上看到Conversation界面时,您不应该认为“这真的是Man”,而是“我在哪里看到Talkable,我可以替换实现Talkable的任何内容,无论是ManWomanParrotRobot等。“

如果我不清楚,有关该主题的可用资源很多。查看Robert Martin的Dependency Inversion PrincipleInterface Segregation PrincipleLiskov Substitution Principle文章,了解初学者。

答案 1 :(得分:3)

接口Comparable应该由其实例可以比较的类实现;接口Comparator(在任何级别的泛型编程语言中,可能是Comparator<T>! - )应该由其实例可以比较其他的类来实现。这两种用法都有很好的用例,基本上是相互脱节的;你似乎错过了这种关键的语义区别。

答案 2 :(得分:1)

接口用于定义对象的必要行为,并且您可以对多个对象具有类似的行为。就像您想要创建人类的行为一样,您可以拥有共享相同的对象的男人和女人行为,但有一些不同的功能/属性。如果不以这种方式使用接口,在这种情况下,您必须为两个人类性别创建2个接口。

因此,接口与对象的行为有关。