OOP中的抽象

时间:2014-10-02 18:27:12

标签: java c++ oop

多年来,我发现了一些定义,并且从未能够清楚地理解抽象是什么。 我已经理解了Oops的3个主要概念,但是在这些特殊概念中遇到了困难,这些概念被刻在这些其他概念中。

直到现在我得出了2个结论,但不确定。

  • 能够隐藏方法(行为)的实现细节,并为用户提供接口。
  • 能够定义方法签名(即仅用于声明它们)而不实际实现它们。

对于面向对象编程的上下文,抽象的正确定义是什么,如果不是上述之一,那么它是什么?

如果还提供支持代码,我们将不胜感激:)

8 个答案:

答案 0 :(得分:1)

  

能够隐藏方法(行为)的实现细节,并为用户提供接口。

排序,但那是“封装”。它们是相关的,意思是“封装”是面向对象设计的关键概念,而“抽象”是该概念的潜在结果。

  

能够定义方法签名(即仅用于声明它们)而不实际实现它们。

这是一个实现细节,而不是抽象本身的概念概念。

在简单的继承模型中,“抽象”可以被认为是通过其祖先(或更抽象)类型之一引用对象。例如,考虑一个层次结构:

Lifeform
Animal
Canine
Golden Retriever

如果您正在执行仅针对Golden Retriever的操作,则无法在任何 Animal上执行该操作。它必须是特定的动物。所以你需要特定的实现。

但是,如果您执行的操作对所有Lifeforms都是通用的,那么您收到的具体实现并不重要。该操作是抽象的,因此它可以接受任何Lifeform对象,无论更具体的实现如何。

接口提供了另一种可以实现抽象的实现机制。对象组合仍然是另一种机制。例如,请考虑这种非继承方案:

public class MyObject {
    private ThirdPartyObject dependency;

    public MyObject() {
        // initialize the dependency
    }

    public boolean getValue() {
        return this.dependency.getValue();
    }

    public void setValue(boolean value) {
        this.dependency.setValue(value);
    }
}

这不会对任何东西使用继承或接口,但它会创建抽象。使用代码对ThirdPartyObject或其实现的细节一无所知。在Law Of Demeter之后,该实现的详细信息已经被抽象为您控制的自定义对象。这对于将代码与您无法控制的实现细节分离非常有用。

答案 1 :(得分:1)

  

抽象是一个只显示“相关”数据并“隐藏”用户不必要的对象详情的过程。

     
      
  • 例如,当您在线登录亚马逊帐户时,请输入   你的user_id和密码,然后按登录,当你按下时会发生什么   登录,输入数据如何发送到亚马逊服务器,如何验证   所有这些都是从你那里抽象出来的。

  •   
  • 另一个抽象的例子:汽车本身就是一个明确的定义   对象,由几个其他较小的对象组成,如   齿轮系统,转向机构,发动机,这些都是他们的   自己的子系统。但对于人类而言,汽车是一个单一的物体,可以通过其子系统来管理,即使它们的内部细节也是如此   不明。

  •   
     

另外需要注意的是,抽象隐藏了实现细节,但实现也可以显示,即具有定义的成员函数也可以存在,与提供总抽象 Interface 不同。

来源:BeginnersBook.com

答案 2 :(得分:0)

我的摘要是"隐藏细节&#34 ;;在编程的情况下,抽象更像是你的第一个定义。

对于支持代码,你真的不需要看得太远。抽象就在身边。考虑公共数据结构string

计算机中的字符串实际上是字节转换为串在一起的特定字符集。 (没有双关语)

因此,当您将"hello, world"加入给您时,它就是引号中的短语。当计算机运行它时,它会创建一个数据结构string,它本身包含表示给定字符串的字节和各种状态。 您(通常)并不关心string对象的工作方式。确实如此,您继续实现目标。这是我可以获得的抽象示例的基础。

答案 3 :(得分:0)

抽象是一个过程,通过这个过程,数据和程序的形式与其含义相似,同时隐藏了实现细节。抽象涉及定义表示可以执行工作的抽象“角色”的对象的工具,报告打开并更改其状态,并与系统中的其他对象“通信”。

抽象可以通过两种方式看出:

数据抽象 - 数据抽象是创建复杂数据类型并仅公开与数据类型交互的有意义操作的方法,其中隐藏了外部工作中的所有实现细节。

控制抽象 - 行为的抽象。提供更简单,更高级别的API,以隐藏客户端不必要的执行细节。

答案 4 :(得分:0)

抽象是一种承诺实现给定抽象的类将具有给定行为的方法。因此,抽象类不能直接实例化,它们首先需要实现抽象。

抽象类因此意味着由具体类实现,该类声明并定义与抽象合同匹配的方法。然而,抽象可以提供一些具体的行为以及抽象的行为。

通过abstract类和interface在Java中完成抽象。在C ++中,通过在类中使用virtual方法来实现抽象。请注意,Java接口仅创建为(与C ++不同),此语言不允许多重继承。

答案 5 :(得分:0)

简单来说

抽象:显示必要的内容并隐藏不必要的细节。例如,如果你的类有10个函数,但是只有2个应该对类的使用者有用,你将这些函数设置为public,而其他函数是私有的,那么消费者可以看到的是所需要的,而不是全部显示。< / p>

封装:隐藏类的消费者的复杂性。防爆。如果你的类需要两个变量来存储min和max,你可以将它们封装在getter和setter下,并在getter和setter中实现所有的验证和检查。这样你就可以隐藏复杂性。

答案 6 :(得分:0)

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

如果我们将设备直接连接到没有插头的电线,请考虑一下?假设将灯泡直接连接到电线,然后电线知道它连接到哪个设备,当我们需要更换灯泡时,我们必须从灯泡中取下电线连接,这意味着灯泡与电线紧密耦合。换句话说,灯泡和电线知道它所连接的细节,意味着没有抽象。

在面向对象的世界中,抽象的工作方式完全相同。使用其他类函数/属性的类不需要知道它正在消耗哪些类函数/属性,并且所有东西都应该用接口/抽象类抽象。

让我编写相同的例子。这里我有一个类“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");
    }
}


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

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

答案 7 :(得分:-1)

oops中有两个对象部分

  • 州(物业)
  • 行为(方法)

所以隐藏任何对象行为的实现称为抽象

让我们举个例子 - &gt; 我家有一位厨师做美味的食物。有些人来我家吃晚饭。晚饭后,他们问我是谁做了这个食物。我回答了

  • 我有一个名叫tttt的厨师,他的地址是tttt,他的号码是0000(这些都是厨师对象的属性)

他们再次询问他是如何做到这一点然后我回答了

  • 我不知道他是怎么做的。我只知道他可以做饭

所以抽象意味着我们告诉我们的对象可以做什么任务,而不是我的对象如何完成任务。

相关问题