1

我在编码时一直试图遵循封装原则。例如,这样做:

公开课学生

private Name As String

public sub setName(ByVal name2 As String)
  Name = Name2
End Public

而不是允许客户端直接访问属性,例如:

Dim s1 As Student
s1.Name = "Mark"

所有的书都说遵循选项二是不好的做法,因为这意味着如果您更改类,客户端代码可能会中断。但是,我不完全理解为什么会这样。如果您删除 Name 成员,那么无论您是否允许他们直接访问该属性,客户端代码都会中断。我错过了什么?

4

3 回答 3

2

简单来说,Name与返回的属性或方法签名不二进制兼容String。因此,如果您创建一个公共成员,然后稍后将其更改为属性,它将破坏任何最初调用该成员的客户端代码。

更多信息在这里:http ://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx

其他原因:

  • 您可以通过属性获得更细粒度的访问控制。
  • 您可以向属性添加断点。
  • 您可以将日志记录添加到属性。
  • 您可以向属性添加验证。
  • 属性用于数据绑定;字段不是。
于 2012-08-20T22:27:09.380 回答
1

如果您有一个属性,您可以在接口中定义它,而这对于字段是不可能的。您还可以区分 getter 和 setter,从而创建只读“字段”。这个想法是尽可能少地给外界提供选择,这样你就可以考虑更少的场景。

于 2012-08-20T22:28:39.473 回答
1

使用这些空属性,除了将给定的值分配给字段或返回字段值之外什么都不做,这是代码膨胀。这不是封装。

封装的真正本质是当字段对外部完全隐藏时,以至于外部的任何代码甚至都不知道有多少字段,而只知道字段的类型或值。然后需要对字段进行的任何处理都由类的公共方法完成。

一个例子是邮件类。与外界无关,您存储电子邮件地址的格式是什么,例如,您将域部分分解为单独的字符串。类的内部工作,即以何种方式将值放入私有字段中,必须对外部完全不透明。

就像有人向你借钱一样。那个人不需要知道你把钱放在哪里,钱包里,保险箱里,银行账户里等等。那个人也不需要知道你有多少钱。你,班级,负责取出钱并给它。

我通过将所有字段设为私有来做到这一点。我的很多方法也是私有的。它只是用于消息传递的少数公共方法。此外,这些值永远不会通过引用返回,总是按值返回,因此外部世界无法在不通过我的方法过滤器的情况下更改我的类中的数据。

属性实际上是一种方法。只要有方法,就必须做一些独特的处理。处理是逻辑,有条件或循环或两者兼而有之。条件可能以多态行为的形式隐藏,但仍然是条件。如果您没有任何处理要做,则不需要该方法。

于 2012-08-20T22:32:57.977 回答