首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中数据隐藏与封装的区别?

问C#中数据隐藏与封装的区别?
EN

Stack Overflow用户
提问于 2022-03-26 17:10:04
回答 1查看 238关注 0票数 0

我已经浏览了一些博客文章和StackOverflow答案,以了解封装是如何在C#(C# - .NET教程中的封装和C# - JavaTPoint封装)中实现的。所有这些博客文章和答案都像预期的那样定义了封装。

将数据和方法绑定在一起的类型称为封装。

但是,在实现部分,他们说它是在C#中通过定义私有变量并使用访问器和变异器/属性提供对它们的访问来实现的。我的问题是为什么这不是数据隐藏?为什么它被认为是封装呢?此外,类、结构(类型)等不应该是如何在C#中实现封装的,因为在这些类中,我们将数据字段和功能绑定在一起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-27 09:53:39

@Unmesh对这个问题这里有一个非常清晰的答案。

封装是一种编程语言特性,它支持数据隐藏。但是,请注意,即使不进行封装,也可以进行数据\信息隐藏。例如,在非面向对象的编程语言中使用模块或函数。因此,封装不是数据隐藏,而是实现它的一种手段。

术语信息隐藏和封装(请到这里来。)的使用存在一定的模糊性。总之,封装是指将相关实体(属性和功能)组合成一个单元,以后可以用单个名称来表示。例如,在过程编程中,将重复代码分组成过程可以被认为是封装。设计人员可以使用通用名称引用此类过程。在OOP中,这个概念从子例程扩展到类和结构。定义公共实例变量的任何类仍然是封装的(尽管这是糟糕的设计选择),但它没有实现数据隐藏。

当我们试图对数据隐藏进行更改时,没有实现数据隐藏的封装代码可能会出现以下问题。作为信息隐藏/封装的示例,请考虑以下类:(来源)

代码语言:javascript
复制
public class BankAccount {
    public int dollars;
}

这个类的实现是封装的,但仍然是不灵活的(例如,我们很难在将来添加对个人美分的支持)和不安全(例如,帐户可以更改为负)。但是,如果我们将数据隐藏在一个正式定义的方法接口后面,我们就可以获得灵活性和安全性。

代码语言:javascript
复制
public class BankAccount {
    private int dollars;

    public void deposit(int dollars) {
        this.dollars += Math.max(0, dollars);
    }
}

我们现在可以控制状态是如何修改的,我们还可以在不破坏客户端代码的情况下更改实现:

代码语言:javascript
复制
public class BankAccount {
    private int cents;

    public void deposit(int dollars) {
        deposit(dollars, 0);
    }

    public void deposit(int dollars, int cents) {
        this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents);
    }
}

这个类现在被更好地封装了,因为我们有关于它的底层实现的隐藏信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71630162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档