给个关于 C# 的属性的例子。
在 JAVA 里,大致是这样的。
public
class
Person
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/4a673f63ed01f43a7c37ee72138a09f5.gif)
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/46e9c3959545ae02192407fab1a8aba3.gif)
{
private String _name;
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
public void setName ( String name )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
{
_name
= name.Upper();
}
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
public String getName ( )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
{
return _name.Upper();
}
}
然后获取和设置的时候需要:
Person _p
=
new
Person();
_p.setName (
" henkoo " ); // setter
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
String _pName = _p.getName(); // getter
public
class
Person
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/4a673f63ed01f43a7c37ee72138a09f5.gif)
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/46e9c3959545ae02192407fab1a8aba3.gif)
{
private string _name;
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
public string Name
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
{
set
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
{
_name
= value.toUpper();
}
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
get
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
{
return _name.toUpper();
}
}
}
Person _p
=
new
Person();
_p.Name =
" henkoo " ; // setter
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
String _pName = _p.Name; // getter
在 JAVA 里,大致是这样的。
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/4a673f63ed01f43a7c37ee72138a09f5.gif)
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/46e9c3959545ae02192407fab1a8aba3.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
private String _name;
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
public void setName ( String name )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
![ContractedSubBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/6ec2099fc723350e4e4465cd54f0708b.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
= name.Upper();
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/60469ad6568c85b736e87545f9b489c5.gif)
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
public String getName ( )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
![ContractedSubBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/6ec2099fc723350e4e4465cd54f0708b.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
return _name.Upper();
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/60469ad6568c85b736e87545f9b489c5.gif)
![ExpandedBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/31c00031d7445e659ee3c69e18bb3746.gif)
然后获取和设置的时候需要:
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
" henkoo " ); // setter
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
String _pName = _p.getName(); // getter
基于 JAVA 写成的《重构》里提到,在“值域访问方式”这个问题上,存在两种截然不同的观点:其中一派认为,在该变量定义所在的 Class 中应该自由(直接)访问他;另一派认为,即使在这个 Class 中,也应该只使用访问函数间接访问之。两派的争论如火如荼。
其中,“间接访问变量” 的好处是,subclass 得以通过“覆写一个函数”而改变获取数据的途径,更支持灵活的数据管理方式。“直接访问变量”的好处则是,代码比较容易阅读。阅读代码的时候,不会需要停下来说,“啊,这只是个取值函数”。
随后,《重构》提供了 Self Encapsulate Field 这个方式来将对 field 的直接访问改为通过访问函数的间接访问。
==============
在 C# 中,可以这样。
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/4a673f63ed01f43a7c37ee72138a09f5.gif)
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/46e9c3959545ae02192407fab1a8aba3.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
private string _name;
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
public string Name
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
![ContractedSubBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/6ec2099fc723350e4e4465cd54f0708b.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
set
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
![ContractedSubBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/6ec2099fc723350e4e4465cd54f0708b.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
= value.toUpper();
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/60469ad6568c85b736e87545f9b489c5.gif)
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
get
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/1ddc3dc245b9d38219e2ed12b5a72cfd.gif)
![ContractedSubBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/6ec2099fc723350e4e4465cd54f0708b.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/7f208592352fa609e96b4b2532efbfb9.gif)
return _name.toUpper();
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/60469ad6568c85b736e87545f9b489c5.gif)
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/60469ad6568c85b736e87545f9b489c5.gif)
![ExpandedBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/31c00031d7445e659ee3c69e18bb3746.gif)
接下来的设置和获取:
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
" henkoo " ; // setter
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a3eba363bb8ade95f9fa2fe141fa5b.gif)
String _pName = _p.Name; // getter
其实改动不大。这里的 Name 就是一个属性(Prototype)。与字段(field)一致的访问方式,与 getter、setter 访问函数一致的处理方式,而且同样支持虚拟、继承和多态。这就是所谓的“公开的一致的接口界面,和隐藏起来的Get、Set的计算细节”。
从这里看来,JAVA 的那套争论是否有些多余:)
![249807.html](https://i-blog.csdnimg.cn/blog_migrate/76ff520295529420a629afed61b0e658.jpeg)
香依香偎孤旅独行的驿站 2005-10-07 17:28
发表评论