抽象和封装之间的区别?

2024-03-08

封装和抽象之间的确切区别是什么?


这里的大多数答案都集中在 OOP 上,但封装开始得更早:

  • 每个函数都是一个封装 https://en.wikipedia.org/wiki/Encapsulation_%28computer_programming%29;伪代码:

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)
    

    Here, distance封装了平面上两点之间(欧几里德)距离的计算:它隐藏了实现细节。这就是封装,纯粹而简单。

  • 抽象 https://en.wikipedia.org/wiki/Abstraction_%28software_engineering%29是的过程概括:采取具体的实现并使其适用于不同的(尽管有些相关的)数据类型。抽象的经典例子是 C 语言qsort对数据进行排序的函数:

    关于的事情qsort是它不关心它排序的数据——事实上,它不知道它对什么数据进行排序。相反,它的输入类型是无类型指针(void*)这只是 C 表达“我不关心数据类型”的方式(这也称为类型擦除)。重要的一点是,实施qsort无论数据类型如何,始终保持不变。唯一的一点就是has需要更改的是比较函数,该函数因数据类型而异。qsort因此希望用户提供所述比较函数作为函数参数。

封装和抽象密切相关,以至于您可以指出它们确实密不可分。出于实际目的,这可能是正确的。也就是说,这是一个不太抽象的封装:

class point {
    numeric x
    numeric y
}

我们封装了点的坐标,但除了对它们进行逻辑分组之外,我们并没有实质上抽象它们。

这是一个非封装的抽象示例:

T pi<T> = 3.1415926535

这是一个通用变量 pi具有给定值(π),并且声明不关心变量的确切类型。诚然,我很难在实际代码中找到这样的东西:抽象实际上总是使用封装。然而,上述does实际上存在于 C++(14) 中,通过变量模板 http://en.cppreference.com/w/cpp/language/variable_template(= 变量的通用模板);语法稍微复杂一些,例如:

template <typename T> constexpr T pi = T{3.1415926535};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象和封装之间的区别? 的相关文章

  • 有没有办法在javascript中代理(拦截)一个类的所有方法?

    我希望能够在类本身的构造函数内代理类的所有方法 class Boy constructor proxy logic do something before each call of all methods inside class like
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 在 Python 中使用类作为命名空间是个好主意吗

    我正在将一堆相关的东西放入一个类中 主要目的是将它们组织到命名空间中 class Direction north 0 east 1 south 2 west 3 staticmethod def turn right d return tu
  • 在VBA中使用类模块作为命名空间是否有任何陷阱

    VBA 不支持命名空间 Java 人员的包 其他语言中的命名空间有助于避免歧义并补充成员名称自动完成等工具 在 VBA 中模拟命名空间的一种方法是在类模块中声明什么是事实上的静态方法 然后在标准模块中声明该类的默认实例 这甚至是一些 Mic
  • Java抽象类实现了一个接口,两者具有相同的方法

    在看一些OOP资料时 我想到了这个让我有点困惑的问题 考虑具有以下接口 抽象类和具体类 package one public interface A void doStuff package one public abstract clas
  • std:: 对象/指针/智能指针的向量传递对象(总线错误:10)?

    我想询问一般建议 下面的代码完全编译并大致代表了我处理的代码的结构 简而言之 我想将从一个地方传递一系列从基类 Class1 派生的对象和一些其他参数到另一个地方 更准确地说 实现父类的不同子类 收集这些子类的实例并传递参数进行处理 问题是
  • 为什么Java不支持C中的clrscr这样的函数?

    我有一个问题 对很多人来说可能听起来很愚蠢 但我不能停下来把它发布在这里 因为在互联网上找不到任何东西 为什么java没有我们在C中使用的clrscr之类的函数 如果我创建了一个基于用户输入反复迭代的 java 控制台应用程序 然后如果我想
  • 继承php中的属性

    我有一个超类 其中包含用于设置它们的属性和方法 class Super private property function construct set this gt property set 然后我有一个需要使用该属性的子类 class
  • 框架时代的封装

    在我以前的 C 工作中 我们总是非常小心地封装成员变量 并且仅在绝对必要时才将它们作为属性公开 我们有非常具体的构造函数来确保您在使用对象之前完全构造了该对象 如今 使用 ORM 框架 依赖注入 序列化等 似乎您最好只依赖默认构造函数并在属
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • 我应该使用课程吗? (Python)

    我正在尝试编写一个包含一些数学函数的小型 Python 模块 例如 它可能包含如下函数 def quad x a b c return a x 2 b x c 您可能会注意到它包含几个参数 即a b c 除了变量x 现在 如果我将其放入文件
  • 从 Robot Framework 访问 python 类的变量

    我有一个 python 文件 例如 Animals py 在里面我定义了 3 个不同的类 如下所示 Animals py class Animal listAnimal dog cat lt def init self Animal con
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • 如何在不使用 viewWillDisappear 的情况下使 NSTimer 无效/取消初始化?

    var faderTimer NSTimer override func viewDidLoad super viewDidLoad self faderTimer NSTimer scheduledTimerWithTimeInterva
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 面向对象的编程和事务

    一点介绍 类包含字段和方法 这次让我跳过属性 字段代表一个state班级的 方法描述behavior班级的 在设计良好的类中 如果方法抛出异常 则不会更改类的状态 对吧 换句话说 无论发生什么 类的状态都不应该被破坏 问题 是否有一个框架
  • 你怎么知道何时使用设计模式? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 任何人都可以阅读 GoF 书来了解什么是设计模式以及如何使用它们 但是弄清楚设计模式何时解决问题的过程是什么 模式的知识是否驱动设计
  • 开闭原则背后的含义和推理是什么?

    开放 封闭原则规定软件实体 类 模块等 应该对扩展开放 但对修改关闭 这意味着什么 为什么它是良好的面向对象设计的重要原则 这意味着您应该将新代码放入新的类 模块中 现有代码应仅针对错误修复进行修改 新类可以通过继承重用现有代码 开放 封闭

随机推荐