我一直试图在编码时遵循封装原则。例如,这样做:
公共班学生
private Name As String
public sub setName(ByVal name2 As String)
Name = Name2
End Public
而不是允许客户端直接访问属性,例如:
Dim s1 As Student
s1.Name = "Mark"
所有的书都说不遵循选项二是不好的做法,因为这意味着如果你改变了类,客户端代码可能会中断。但是,我不完全理解为什么会这样。如果删除Name成员,则无论是否允许他们直接访问该属性,客户端代码都将中断。我错过了什么?
答案 0 :(得分:2)
简单来说,Name
与返回String
的属性或方法签名不是二进制兼容的。因此,如果您创建一个公共成员,然后稍后将其更改为属性,它将破坏最初调用该成员的任何客户端代码。
此处有更多信息:http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx
其他原因:
答案 1 :(得分:1)
如果您有一个属性,则可以在界面中定义它,这对于字段是不可能的。您还可以区分getter和setter,从而创建只读“字段”。我们的想法是尽可能少地向外界提供选项,因此您可以考虑较少的场景。
答案 2 :(得分:1)
使用这些类型的空属性,除了将给定值赋给字段或返回字段值之外什么也不做,这是代码膨胀。这不是封装。
封装,其真正的本质是,当字段完全从外部隐藏时,外面的任何代码甚至不知道有多少字段,而是单独的字段类型或值。然后,需要在字段上完成的任何处理都是通过类的公共方法完成的。
一个例子是邮件类。外部世界以您存储电子邮件地址的格式无关紧要,例如,您要在单独的字符串中破坏域部分。一个类的内部工作,即以什么方式放在私有字段中的值必须对外部完全不透明。
就像有人要你贷款一样。那个人不需要知道你把钱放在哪里,钱包里,安全里,银行账户里。那个人也不需要知道你有多少钱。你,这个班,负责拿出钱并给它。
我通过将所有字段设为私有来实现此目的。我的很多方法也都是私密的。它只是一些用于消息传递的公共方法。此外,值永远不会通过引用返回,始终按值返回,因此外部世界无法通过我的方法过滤器更改我的类中的数据。
属性实际上是一种方法。只要有方法,就必须进行一些独特的处理。处理是逻辑,有条件或循环或两者兼而有之。条件可能以多态行为的形式隐藏,但仍然是条件。如果您没有任何处理,则不需要该方法。