给个关于 C# 的属性的例子。
在 JAVA 里,大致是这样的。
然后获取和设置的时候需要:
在 JAVA 里,大致是这样的。
public
class
Person
{
private String _name;
public void setName ( String name )
{
_name = name.Upper();
}
public String getName ( )
{
return _name.Upper();
}
}
{
private String _name;
public void setName ( String name )
{
_name = name.Upper();
}
public String getName ( )
{
return _name.Upper();
}
}
然后获取和设置的时候需要:
Person _p
=
new
Person();
_p.setName ( " henkoo " ); // setter
String _pName = _p.getName(); // getter
_p.setName ( " henkoo " ); // setter
String _pName = _p.getName(); // getter
基于 JAVA 写成的《重构》里提到,在“值域访问方式”这个问题上,存在两种截然不同的观点:其中一派认为,在该变量定义所在的 Class 中应该自由(直接)访问他;另一派认为,即使在这个 Class 中,也应该只使用访问函数间接访问之。两派的争论如火如荼。
其中,“间接访问变量” 的好处是,subclass 得以通过“覆写一个函数”而改变获取数据的途径,更支持灵活的数据管理方式。“直接访问变量”的好处则是,代码比较容易阅读。阅读代码的时候,不会需要停下来说,“啊,这只是个取值函数”。
随后,《重构》提供了 Self Encapsulate Field 这个方式来将对 field 的直接访问改为通过访问函数的间接访问。
==============
在 C# 中,可以这样。
public
class
Person
{
private string _name;
public string Name
{
set
{
_name = value.toUpper();
}
get
{
return _name.toUpper();
}
}
}
{
private string _name;
public string Name
{
set
{
_name = value.toUpper();
}
get
{
return _name.toUpper();
}
}
}
接下来的设置和获取:
Person _p
=
new
Person();
_p.Name = " henkoo " ; // setter
String _pName = _p.Name; // getter
_p.Name = " henkoo " ; // setter
String _pName = _p.Name; // getter
其实改动不大。这里的 Name 就是一个属性(Prototype)。与字段(field)一致的访问方式,与 getter、setter 访问函数一致的处理方式,而且同样支持虚拟、继承和多态。这就是所谓的“公开的一致的接口界面,和隐藏起来的Get、Set的计算细节”。
从这里看来,JAVA 的那套争论是否有些多余:)