理解封装和抽象的简单方法

Bil*_*lla 67 language-agnostic oop encapsulation abstraction

学习OOP概念特别有兴趣深入了解抽象和封装.

已经查看了下面的内容

抽象VS信息隐藏VS封装

抽象和封装之间的区别?

我发现用一个真实而简单的示例类/代码片段很难理解这些概念.

我的一位同事说抽象只不过是创建抽象类和普通类来保护其成员变量的范围称为封装.

是否有一种简单的方法可以理解并帮助其他人了解它们究竟是什么,而不是重复下面的内容?

抽象和封装是互补的概念:抽象侧重于对象的可观察行为......封装侧重于产生这种行为的实现......封装通常是通过信息隐藏来实现的,这是隐藏所有内容的过程.对象的秘密不会对其基本特征产生影响.

Yas*_*ser 160

抽象是一个过程,您只显示"相关"数据并从用户"隐藏"对象的不必要细节.考虑一下你的手机,你只需要知道按下哪些按钮来发送信息或拨打电话,按下按钮时会发生什么,你的消息发送方式,你的呼叫连接方式都是从用户.

封装是将数据和函数组合成一个称为类的单元的过程.在封装中,不直接访问数据; 它是通过类中存在的函数访问的.简单来说,类的属性保持私有,并提供公共getter和setter方法来操作这些属性.因此,封装使数据隐藏的概念成为可能.

在此输入图像描述


JRR*_*JRR 26

抽象是隐藏信息或仅向客户提供必要的细节.

例如汽车刹车 - 你只知道按下踏板会使车辆停下来,但你不需要知道内部是如何工作的.

抽象的好处明天如果制动器实现从鼓式制动器变为盘式制动器,作为客户端,您无需更改(即您的代码不会更改)

封装将数据和行为绑定在一个单元中.它也是一种限制对某些组件的访问的语言机制(这可以通过私有,受保护等访问修饰符来实现)

例如,Class具有属性(即数据)和行为(即对该数据进行操作的方法)

  • 正确的。OOP 是一种哲学和语言中立的。 (2认同)
  • 封装的一个很好的例子是使用 Getters 和 Setters。您可以通过 Setter 方法为类(对象)实例的私有属性赋值(例如,`setName("john")`,其中 `setName(firstName)` 是包含 `_firstName = firstName` 的公共方法其中“_firstName”是私有财产)。 (2认同)
  • 或者,...,封装是实现抽象的一种方式? (2认同)

Mik*_*eSW 13

使用C#的示例

//abstraction - exposing only the relevant behavior
public interface IMakeFire
{
     void LightFire();
}

//encapsulation - hiding things that the rest of the world doesn't need to see
public class Caveman: IMakeFire
{
     //exposed information  
     public string Name {get;set;}

     // exposed but unchangeable information
     public byte Age {get; private set;}

     //internal i.e hidden object detail. This can be changed freely, the outside world
     // doesn't know about it
     private bool CanMakeFire()
     {  
         return Age >7;
     }

     //implementation of a relevant feature
     public void LightFire()
     {
        if (!CanMakeFire())
        {
           throw new UnableToLightFireException("Too young");
        }
        GatherWood();
        GetFireStone();
        //light the fire

     }

     private GatherWood() {};
     private GetFireStone();
}

public class PersonWithMatch:IMakeFire
{
      //implementation
 }
Run Code Online (Sandbox Code Playgroud)

任何穴居人都可以生火,因为它实现了IMakeFire的 "功能".拥有一组消防员(List),这意味着Caveman和PersonWithMatch都是有效的选择.

这意味着

  //this method (and class) isn't coupled to a Caveman or a PersonWithMatch
  // it can work with ANY object implementing IMakeFire
  public void FireStarter(IMakeFire starter)
  {
        starter.LightFire();
    }
Run Code Online (Sandbox Code Playgroud)

因此,您可以拥有大量具有大量细节(属性)和行为(方法)的实现者,但在这种情况下,重要的是他们的生成能力.这是抽象.

由于制作火需要一些步骤(GetWood等),因此它们是视图中隐藏的,因为它们是类的内部关注点.穴居人还有许多其他可以被外界称呼的公共行为.但是一些细节将始终隐藏,因为它们与内部工作有关.它们是私有的,仅存在于物体中,它们永远不会暴露.这是封装


Pre*_*raj 6

抽象是一般术语.即封装是抽象的子集.

抽象是管理复杂系统的强大方法.抽象由明确定义的对象及其层次分类管理.

例如,汽车本身就是一个明确定义的对象,它由几个其他较小的对象组成,如齿轮系统,转向机构,引擎,它们也有自己的子系统.但对于人类而言,汽车是一个单一的物体,即使其内部细节未知,也可以通过其子系统进行管理. 礼貌


封装:将数据成员和方法一起包装到一个单元(即Class)中称为封装.

封装就像封闭在胶囊中.这是将与对象相关的相关操作和数据包含在该对象中.

封装就像你的包,你可以保存你的笔,书等.这意味着这是封装成员和功能的属性.

class Bag{
    book;
    pen;
    ReadBook();
}
Run Code Online (Sandbox Code Playgroud)

封装意味着隐藏对象的内部细节,即对象如何做某事.

封装可防止客户端看到其内部视图,其中实现了抽象的行为.

封装是一种用于保护对象中的信息不受其他对象影响的技术.

隐藏数据以确保安全性,例如将变量设置为私有,并公开属性以访问公开的私有数据.

因此,当您访问该属性时,您可以验证数据并进行设置. 礼貌


ari*_*ver 6

抽象是一种隐藏细节以简化界面的方法。

因此,以汽车为例,汽车中的所有控件都是抽象的。这使您可以在不了解转向、加速或减速系统的基本细节的情况下操作车辆。

一个好的抽象是广泛地标准化接口,跨越类似问题的多个实例。一个伟大的抽象可以改变一个行业。

现代方向盘、刹车踏板和油门踏板都是极好的抽象例子。汽车转向最初看起来更像是自行车转向。刹车和油门都是手动操作的。但是我们今天使用的抽象是如此强大,它们席卷了整个行业。

——

封装是一种隐藏细节以保护它们免受外部操纵的手段。

封装是防止驾驶员操纵汽车驾驶方式的原因——从转向、悬架和制动的刚度,到油门和变速箱的特性。大多数汽车不提供用于更改任何这些东西的接口。这种封装可确保车辆按照制造商的预期运行。

有些汽车提供少量的驾驶模式——比如豪华、运动和经济——允许驾驶员同时改变其中的几个属性。通过提供驾驶模式,制造商允许驾驶员对体验进行一些控制,同时防止他们选择会使车辆不那么愉快或不安全的属性组合。通过这种方式,制造商隐藏了细节以防止不安全的操作。这就是封装。


Vij*_*han 5

好吧,我将用一个真实世界的例子来解释抽象。假设您家里确实有一个电插头,许多设备可以连接到同一个插头,但插头永远不知道它连接到哪个设备,换句话说,设备的细节被抽象(隐藏)到插头中。

想想如果我们在没有插头的情况下将设备直接连接到电线会怎样?假设将灯泡直接连接到电线,然后电线知道它连接到哪个设备,并且当我们需要更换灯泡时,我们必须从灯泡上拆下电线连接,这意味着灯泡与电线紧密耦合。换句话说,灯泡和电线知道它连接到的细节,意味着没有抽象。

在面向对象的世界中,抽象的工作原理完全相同。使用其他类函数/属性的类不需要知道它正在使用哪些类函数/属性,一切都应该用接口/抽象类进行抽象。

让我编写相同的示例。在这里,我有一个类“ElectricPlug”,它正在运行一个设备。但是“ElectricPlug”类不知道它正在运行哪个设备。它可以是任何实现“IDevice”接口的类,这意味着“RunDevice”的实现是从“ElectricPlug”中抽象出来的。这是完整的示例代码,

class Program
{
    static void Main(string[] args)
    {
        ElectricPlug electricPlug = new ElectricPlug(new Bulb());
    }
}

public class ElectricPlug
{
    private readonly IDevice _device;
    public ElectricPlug(IDevice device)
    {
        _device = device;
    }

    public void Run()
    {
        _device.Rundevice();
    }
}


public interface IDevice
{
    void Rundevice();
}


public class Bulb : IDevice
{
    public void Rundevice()
    {
       Console.WriteLine("Switched on bulb");
    }
}
Run Code Online (Sandbox Code Playgroud)


Cra*_*lus 4

抽象是一个过程,您从计划在设计中捕获/表示的实体中“丢弃”不必要的细节,并仅保留与您的领域相关的实体的属性。
示例:要代表汽车,您将保留例如型号和价格、当前位置和当前速度,并忽略颜色和座位数量等。

封装是属性和在单个抽象单元(即类)中操作它们的操作的“绑定”。
所以汽车可以accelarate stop操纵位置和当前速度等。

  • 似乎抽象是一种概念性的理解,我猜与“abstract”关键字无关。 (5认同)