当前位置: 首页 > 知识库问答 >
问题:

理解OOP中的封装和抽象

任繁
2023-03-14

我正在阅读OOP的一些基本内容。我对封装和抽象感到困惑。根据我的理解,抽象是一种只暴露很少的东西而隐藏很少的东西的方式。封装帮助我们封装对象的状态,以便外部世界无法访问它,并且可以通过内部方法访问它。因此,它们都是相关的。但是我读过很多次,封装是通过使用getter和setter实现的,而抽象是通过使用抽象类和接口实现的。现在考虑下面的代码(C)

class A
    {
        private int a;
        public void print()
        {
            Console.WriteLine("Value of a = {0}", a);
        }
    }
    class B
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.print();                
        }
    }

在上面的代码中,我没有使用接口或抽象类,但根据我的理解,我在这里通过不让B类直接访问变量a实现了抽象。通过实现封装,我确保它只能通过使用A的内部方法访问。所以你能帮我清除混乱吗?

共有2个答案

欧阳飞章
2023-03-14

封装意味着隐藏复杂性,抽象意味着暴露本质。

例子:

汽车与发动机、化油器和其他使其可移动的东西一起工作,(这被称为封装),但用户只知道驾驶汽车需要知道的拖车、车轮、刹车、门和加速器(这被称为抽象)

鲁光霁
2023-03-14

您在示例中实现了抽象。

“抽象”是一个言过其实的词,它的确切含义也取决于上下文,这就是为什么有时它会让我们感到困惑。根据定义,“抽象只捕获与当前透视图相关的对象细节。”

在您的例子中,(用户)类B要求对象“a”(类a的类型)打印某些内容,而不详细说明类“a”是如何实现的。所以只有方法名和用户相关,而不是细节。

我对Abstration也有很多疑问,但这个关于抽象的维基百科页面对我帮助很大。

抽象也用于许多硬件和软件概念,如HAL、Datbase、多语言等。

作为OOPS四大支柱之一,它是定义表示抽象“参与者”(意味着类)的对象的工具,这些对象可以执行工作(作为方法)、报告和改变它们的状态(事件),并与系统中的其他对象“通信”

另一方面,封装是(维基百科上给出的):

术语封装指的是隐藏状态细节,但扩展了数据类型的概念,并标准化了不同数据类型的交互方式(这是抽象的开始)。

但是如果你从更深的意义上理解“抽象”并将其概括(同样来自维基百科页面):

当抽象进入定义的操作,使不同类型的对象能够被替换时,它被称为多态性。当它在类型或类内部以相反的方向进行时,将它们结构化以简化一组复杂的关系,称为委托或继承

 类似资料:
  • 我在研究面向对象的概念,那里的抽象概念基本上被描述为对用户隐藏实现。所以,如果一个类中有一个成员函数,我们为某个任务调用该函数,抽象表示用户不应该关心事情是如何完成的,而应该只知道做了什么。但即使是在非面向对象编程风格中,如果我们编写一个函数,整个任务也只需调用一个函数即可完成。它不也遵循抽象逻辑吗?或者,OOP中的抽象和函数式编程之间有什么区别吗?

  • 学习OOP概念,特别对深入理解抽象和封装感兴趣。 已签出以下内容 抽象VS信息隐藏VS封装 抽象和封装之间的区别? 我发现如果没有一个真实的、简单的示例类/代码片段,很难理解这些概念。 我的一个同事说过,抽象就是创建抽象类和普通类,用作用域保护其成员变量,称为封装。 有没有一种简单的方法我可以理解并帮助别人理解他们到底是什么,而不是重复下面的内容? 抽象和封装是互补的概念:抽象关注对象的可观察行为

  • 我正在准备一次面试,并决定重温一下我的OOP概念。有数百篇文章可供使用,但似乎每一篇文章的描述都不一样。有人说 抽象是“识别具有系统变化的公共模式的过程;抽象代表了公共模式,并提供了一种指定使用哪种变化的方法”(Richard Gabriel)。 并通过抽象的类来实现。 另一些人说 抽象意味着只向对象的客户端显示必要的细节 而且 假设您的Employee类中有一个方法“CalculateSalar

  • Truffle provides contract abstractions for interacting with your contracts. Skip ahead to the api section for a list of contract methods. 使用方法 To obtain a contract abstraction you can require it with

  • 问题内容: 封装和抽象之间的确切区别是什么? 问题答案: 这里的大多数答案都集中在OOP上,但封装要早得多: 每个函数都是一个封装 ; 用伪代码: 这里,封装了平面中两点之间的(欧几里得)距离的计算:隐藏了实现细节。这是封装,纯净而简单。 抽象是泛化的过程:采取具体的实现方式并将其应用于不同的(尽管有些相关)数据类型。抽象的经典示例是C的qsort数据排序功能: 关于的事情是,它不关心排序的数据-

  • 我今天有个面试。我有一个来自OOP的问题,关于封装之间的区别 我告诉她,封装基本上是绑定数据成员 在提出这个问题之前,我阅读了StackOverFlow上的其他线程,了解这两个OOPs概念之间的区别。但我发现自己无法说服面试官。 有人能举个最简单的例子来证明吗?