【问题标题】:Is interface highest level of abstraction?接口是最高抽象级别吗?
【发布时间】:2009-07-29 15:24:13
【问题描述】:

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

【问题讨论】:

  • 这是我的评论:什么?你需要解释更多。
  • 界面类型错误。您应该使用 OOP 以及您所谈论的任何语言来标记它,这样我们就可以为您指明正确的方向。
  • 这些术语在不同语言中是否不同。我猜 OOPS 到处都是一样的。

标签: oop interface


【解决方案1】:

我认为你的术语很混乱。

  1. Encapsulation - 将相关数据和功能放在一处。我们可以通过类来获得这个

  2. Polymorphism - 允许使用统一接口处理不同数据类型的值。

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

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

编辑

Q) 你问“我可以说,抽象是通过封装和多态实现的最高层次结构吗?”

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

Functional Decomposition是一种抽象形式,不使用Object Orientation就可以实现,它应该在层次结构中的什么位置?

我可以对层次结构做的最好的事情就是这个定义(我自己的想法,所以 YMMV)

  1. 抽象是实践 把一个大问题分解成 更小的组件,所以每个更小 问题可以解决 (相对)隔离。
  2. 多态是一种我们可以使用的技术 用于实现抽象。它 涉及识别不同的类型 的数据和行为,可以 以均匀的方式处理。
  3. 接口只声明类型 行为,封装 类型中的行为。它不提供 实际行为或数据
  4. 抽象类声明的类型 行为,但也可以提供 行为和数据,全部封装 在一个类型中。
  5. 因此,可以看到一个界面 作为提供一个 simplerpurer 多态形式比抽象形式 类。

【讨论】:

  • 我可以说,抽象是通过封装和多态实现的最顶层的层次结构。
【解决方案2】:

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

在面向对象的编程理论中, 抽象涉及到设施 定义代表抽象的对象 可以执行工作的“演员”,报告 打开并更改它们的状态,以及 与其他对象“交流” 系统。术语封装 指隐藏状态细节, 但扩展了数据类型的概念 从早期的编程语言到 将行为与 数据和标准化方式 不同的数据类型交互,是 抽象的开始。什么时候 抽象进入 定义的操作,启用对象 被替换的不同类型, 它被称为多态性。当它 向相反的方向前进, 在类型或类中, 构造它们以简化复杂的 一组关系,称为 委托或继承。

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

【讨论】:

    【解决方案3】:

    我认为你说得对。一个界面概括地说:这就是这种东西。一个班级说:这就是这个东西的工作原理;我会把细节隐藏在自己的内心。类是(通常)接口抽象的具体实现。

    【讨论】:

      【解决方案4】:

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

      一个非常人为的例子:

      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;
        }
      }
      

      您可能会像这样更新 Person:

      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 何时可以购买某种类型的饮料,则 Person 正在封装逻辑。饮料接口抽象出与饮料相关的逻辑。

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

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 1970-01-01
        • 2023-04-02
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 2023-03-21
        相关资源
        最近更新 更多