界面和细节

给个关于 C# 的属性的例子。

在 JAVA 里,大致是这样的。

None.gif public   class  Person
ExpandedBlockStart.gifContractedBlock.gif
{
InBlock.gif    
private String _name;
InBlock.gif
InBlock.gif    
public void setName ( String name )
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
InBlock.gif        _name 
= name.Upper();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public String getName ( )
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
InBlock.gif        
return _name.Upper();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

然后获取和设置的时候需要:

None.gif     Person _p  =   new  Person();
None.gif    _p.setName (
" henkoo " );         // setter
None.gif
    String _pName  =  _p.getName();  // getter


基于 JAVA 写成的《重构》里提到,在“值域访问方式”这个问题上,存在两种截然不同的观点:其中一派认为,在该变量定义所在的 Class 中应该自由(直接)访问他;另一派认为,即使在这个 Class 中,也应该只使用访问函数间接访问之。两派的争论如火如荼。

其中,“间接访问变量” 的好处是,subclass 得以通过“覆写一个函数”而改变获取数据的途径,更支持灵活的数据管理方式。“直接访问变量”的好处则是,代码比较容易阅读。阅读代码的时候,不会需要停下来说,“啊,这只是个取值函数”。

随后,《重构》提供了 Self Encapsulate Field 这个方式来将对 field 的直接访问改为通过访问函数的间接访问。

==============

在 C# 中,可以这样。

None.gif public   class  Person
ExpandedBlockStart.gifContractedBlock.gif
{
InBlock.gif    
private string _name;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
InBlock.gif        
set
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
InBlock.gif            _name 
= value.toUpper();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
get
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
InBlock.gif            
return _name.toUpper();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

接下来的设置和获取:

None.gif     Person _p  =   new  Person();
None.gif    _p.Name =
" henkoo " ;       // setter
None.gif
    String _pName  =  _p.Name;  // getter


其实改动不大。这里的 Name 就是一个属性(Prototype)。与字段(field)一致的访问方式,与 getter、setter 访问函数一致的处理方式,而且同样支持虚拟、继承和多态。这就是所谓的“公开的一致的接口界面,和隐藏起来的Get、Set的计算细节”。

从这里看来,JAVA 的那套争论是否有些多余:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值