荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Version (Who makes history and why), 信区: Program
标  题: private和protected有什么区别?
发信站: 荔园晨风BBS站 (Wed Apr  9 21:53:40 2003), 站内信件


他认为protected的使用让一个字段或函数处于一种暧昧的地位
要么就应该是private的,封装起来不如用户知道实现细节
要么就应该是public,提供给最终用户一个清晰明确的接口定义
是与非之间不应该存在一种中间状态,导致使用者的迷惑

从这个角度来说我是同意他的看法,自己也在尽量减少protected的使用
但同时我认为protected是一种对于开发人员自己的捷径
对于明了类结构的人来说适当的使用protected可以简化代码

如在开发一个类库或者一个程序内部使用的一个类树时
自己的类与子类之间可以通过protected简化代码同时隐藏实现
但你的类展现给其他用户或者对结构不熟悉的开发者时
就应该尽量杜绝protected的使用,因为这些隐藏在接口后的
实现细节可能导致不当的使用。如果有必要让最终用户使用
就应该直接public出来并提供详细文档和适当防御代码
如果没有必要使用则应该private,而不是protected起来
让用户迷惑于到底是否应该使用之

而C++的库的发布一般又必须跟随着头文件,头文件里面也无法
避免private/protected的定义,定义了protected后就无法降低其可访问级别
这样造成只要你声明protected,不论你是否是内部使用,是否准备给最终用户使用,
最终用户都会看到你的定义,并且被其功能所诱惑 :)

因此,最好的protected的使用方法是不用,其次是用在内部继承时
而最终接口中直接对用户公开,确定地向最终用户提供使用手段例如
class A { protected: void *m_pv; };
class B : public A
{
public:
  int Count(void) const { return *static_cast<int *>(m_pv); }
  void Count(int nCount) { ... }
};
class C : public A
{
  float Count(float fCount) const { return *static_cast<float *>(m_pv); }
  void Count(float fCount) { ... }
};
这样的使用方法可以某种程度上简化代码,但已经是属于比较dirty的用法了 :)
还有就是从语言一级提供类似C#中internal访问级别的支持
定义此字段只能由同一assembly中继承自此类的子类进行访问
这样就完美解决了代码简化和接口封装的矛盾,
这样的使用方法可以某种程度上简化代码,但已经是属于比较dirty的用法了 :)
还有就是从语言一级提供类似C#中internal访问级别的支持
定义此字段只能由同一assembly中继承自此类的子类进行访问
这样就完美解决了代码简化和接口封装的矛盾,
如果C+下个版本能够提供类似的定义如
限制某个字段只能被同一namespace的继承自此类的子类访问就好了 :)


--
                      *
          *                                  *
                          *             *
                      no more to say
                  ★     just wish you   ★
                            good luck

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.50]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店