封装 - 存取方法

时间:2012-08-20 22:24:25

标签: .net vb.net

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

公共班学生

private Name As String

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

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

Dim s1 As Student
s1.Name = "Mark"

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

3 个答案:

答案 0 :(得分:2)

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

此处有更多信息:http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx

其他原因:

  • 您可以使用属性获得更细粒度的访问控制。
  • 您可以向属性添加断点。
  • 您可以向属性添加日志记录。
  • 您可以向属性添加验证。
  • 属性用于数据绑定;字段不是。

答案 1 :(得分:1)

如果您有一个属性,则可以在界面中定义它,这对于字段是不可能的。您还可以区分getter和setter,从而创建只读“字段”。我们的想法是尽可能少地向外界提供选项,因此您可以考虑较少的场景。

答案 2 :(得分:1)

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

封装,其真正的本质是,当字段完全从外部隐藏时,外面的任何代码甚至不知道有多少字段,而是单独的字段类型或值。然后,需要在字段上完成的任何处理都是通过类的公共方法完成的。

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

就像有人要你贷款一样。那个人不需要知道你把钱放在哪里,钱包里,安全里,银行账户里。那个人也不需要知道你有多少钱。你,这个班,负责拿出钱并给它。

我通过将所有字段设为私有来实现此目的。我的很多方法也都是私密的。它只是一些用于消息传递的公共方法。此外,值永远不会通过引用返回,始终按值返回,因此外部世界无法通过我的方法过滤器更改我的类中的数据。

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