当前位置: 首页 > 面试题库 >

抽象和封装之间有什么区别?

元昊苍
2023-03-14
问题内容

Java中的封装和抽象之间到底有什么区别?任何简短的例子也将不胜感激。


问题答案:

抽象和封装是两个很好的味道,它们在一起味道很好。

封装 可以最大程度地减少向代码用户展示的内容。该“用户”可以是您代码的其余部分,也可以是使用您发布的代码的任何人。

封装有一定的好处:

  • 代码的用户不依赖于程序中可能更改的部分。当您更改程序时,他们不必更改代码
  • 您可以更好地控制代码和状态在程序生命周期中的变化方式。您必须处理更少的场景,并且可以解决更少的意外问题

我不懂Java,但这是C#封装的一个小例子:

public class Giraffe
{
    public Giraffe(int heightInFeet)
    {
        this.heightInFeet = heightInFeet;
        this.numberOfSpots = heightInFeet * 72;
    }

    public override string ToString()
    {
        return "Height: " + heightInFeet + " feet"
            + " Number of Spots: " + numberOfSpots;
    }

    private int heightInFeet;
    private int numberOfSpots;
}

numberOfSpots它没有公开,而是封装在类中,并通过ToString方法公开。

抽象 使用扩展点使选择推迟到运行精确代码的其他部分。可以在您程序的其他位置,在另一个程序中或在运行时动态选择该选项。

抽象也有很多好处:

  • 当您更改实现抽象的代码时,抽象的用户不必更改其代码。只要抽象不变,用户就不必更改其代码。
  • 当编写使用抽象的代码时,您可以编写一次可对实现该抽象的任何新代码重复使用的代码。您可以编写更少的代码来完成更多工作。

C#中高度使用的抽象是IEnumerable。列表,数组,字典和任何其他类型的集合类都实现IEnumerable。的foreach环结构和LINQ库的整体是基于抽象:

public IEnumerable<int> GetSomeCollection()
{
    // This could return any type of int collection.  Here it returns an array
    return new int[] { 5, 12, 7, 14, 2, 3, 7, 99 };
}

IEnumerable<int> someCollectionOfInts = GetSomeCollection();

IEnumerable<string> itemsLessThanFive = from i in someCollectionOfInts
                                        where i < 5
                                        select i.ToString();

foreach(string item in itemsLessThanFive)
{
    Console.WriteLine(item);
}

您也可以轻松编写自己的抽象:

public interface IAnimal
{
    bool IsHealthy { get; }
    void Eat(IAnimal otherAnimal);
}

public class Lion : IAnimal
{
    public Lion()
    {
        this.isHealthy = true;
    }

    public bool IsHealthy
    {
        get { return isHealthy; }
    }

    void Eat(IAnimal otherAnimal)
    {
        if(otherAnimal.IsHealthy && !(otherAnimal is SlimeMold))
        {
            isHealthy = true;
        }
        else
        {
            isHealthy = false;
        }
    }

    private bool isHealthy;
}

IAnimal someAnimal = PullAnAnimalOutOfAWoodenCrate();

Console.WriteLine("The animal is healthy?: " + someAnimal.IsHealthy);

就像我IAnimal和和一样,您可以将两者一起使用IsHealthy
IAnimal是一个抽象,只有一个get访问器,封装set上没有访问器IsHealthy



 类似资料:
  • 在采访中,我被要求解释抽象和封装之间的区别。我的回答是大致相同的 > 抽象允许我们以最简单的方式表示复杂的现实世界。它是识别一个对象应该具备的相关品质和行为的过程;换句话说,代表必要的特征而不代表背景细节。 封装是一个从外部真实世界隐藏对象所有内部细节的过程。“封装”这个词,就像“封装”成一个“胶囊”。它限制客户端查看实现抽象行为的内部视图。 我想通过以上的回答,面试官确信了这一点,但随后我被问到

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

  • 问题内容: 我不清楚两者之间的区别。 谢谢 问题答案: 它们非常相似,但是存在一些重要的技术差异: 抽象类允许您为某些方法提供默认的实现,但是接口不允许您提供任何实现。 您可以实现多个接口,但只能从一个抽象类继承。 这些差异影响应使用两种技术的方式: 您应该使用接口来 定义合同 。 抽象类对于 重用代码 很有 用 ……但是请注意,它不是重用代码的唯一方法。您还应该考虑其他方法,例如遏制。

  • 信息隐藏和封装之间有什么区别? 我已经读过,封装意味着将数据和应该对其进行操作的过程捆绑在一起。如果是这样,那么下面的类是否实现了封装? 现在声明数据属性会实现信息隐藏吗?

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

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