接口是否是最高级别的抽象?

时间:2009-07-29 15:24:14

标签: oop interface

我对抽象和封装感到困惑。我觉得这个类是封装,因为它封装了数据和行为,而接口是抽象的。请发表评论

4 个答案:

答案 0 :(得分:13)

我认为你的术语很混乱。

  1. Encapsulation - 将相关数据和功能放在一个位置。我们可以通过课程

  2. 来解决这个问题
  3. Polymorphism - 允许使用统一界面处理不同数据类型的值。

  4. 可以通过继承基类(使用虚函数)和/或实现接口来实现多态性。

    这些技术(和其他技术)给我们abstraction,它真正适用于我们用来将问题分解成更小组件的任何过程。

    修改

    问)你问“我能否说,抽象是通过封装和多态实现的最顶层?”

    A)我无法回答这个问题,我不知道你的意思是“最高”和“最高”。 这里没有层次结构。

    Functional Decomposition是一种抽象形式,它可以在不使用面向对象的情况下实现,它应该在层次结构中出现在哪里?

    我能用层次结构做的最好的就是这个定义(直接来自我自己的头脑,所以YMMV)

    1. 抽象是实践 打破一个大问题 较小的组件,所以每个更小 可以解决问题 (相对)隔离。
    2. 多态性是我们可以采用的技术 用来实现抽象。它 涉及识别不同类型 可以的数据和行为 以同质的方式对待。
    3. 接口仅声明类型 行为,封装了 一种类型的行为。它没有提供 实际行为或数据
    4. 抽象类声明类型 行为,但也可能提供 行为和数据,全部封装 在一个类型。
    5. 因此,可以看到界面 提供更简单的 purer 多态的形式比抽象的 类。

答案 1 :(得分:4)

查看关于abstraction in Computer Science的维基百科文章。特别是,您可能对面向对象编程的抽象感兴趣。我引用了以下相关部分的部分内容:

  

在面向对象编程理论中,   抽象涉及设施   定义表示抽象的对象   报告,可以执行工作的“演员”   并改变他们的状态   与其他物体“沟通”   系统。封装一词   是指隐藏国家细节,   但扩展了数据类型的概念   从早期的编程语言到   最强烈地关联行为   数据,并标准化的方式   不同的数据类型相互作用,是   抽象的开始。什么时候   抽象进入了   定义的操作,启用对象   要替换的不同类型   它被称为多态性。当它   向相反的方向前进,   在类型或类中,   构建它们以简化复杂   一组关系,它被称为   授权或继承。

通常,我会说接口AND类应该是抽象的例子,将数据作为概念“事物”而不是原始数据来处理。封装用于使这些抽象与概念上不同的“事物”的其他抽象一起很好地工作。

答案 2 :(得分:2)

我认为你说得对。一个界面广泛地说:这就是这种事情。一堂课说:这里的东西是如何运作的;我会隐藏自己内部的细节。类是接口抽象的(通常)具体实现。

答案 3 :(得分:1)

封装的目的是隐藏实现细节:

一个非常人为的例子:

public class Person {
  private int age;

  public boolean canBuyBeer() {
    return age >= 21;
  }

}

您可能稍后将其更改为:

public class Person {
  private int age;
  private boolean isInUSA


  public boolean canBuyBeer() {
    if( isInUSA )
        return age >= 21;
    else
         return age >= 18;
  }

}

有关年龄和原籍的规则可能会发生变化,但来电者无需知道。

接口可用于抽象出不同的类型。考虑一下:

public interface Beverage {
  public boolean containsAlchohol;
}

public class Soda implements Beverage {
  public boolean containsAlchohol {  
      return false;
  }
}
public class Beer implements Beverage {
  public boolean containsAlchohol {
       return true;
  }
}

您可以更新人员:

public class Person {
  private int age;
  private boolean isInUSA


  public boolean canBuyBeverage(Beverage b) {
    if( b.containsAlchohol() ) {
       if( isInUSA )
           return age >= 21;
       else
           return age >= 18;
    }
    else {
        return true;
    }
  }

}

因此,如果一个人可以购买某种类型的饮料,那么Person就会封装逻辑。饮料界面抽象出与饮料相关的逻辑。

可以有更好的例子,但这是一般的想法。