开发者社区


C++/C | Java | .Net/Windows | Linux/Unix | 开源 | 其他
首页 - 编程
编程
全文搜索:   

避免使用 protected 类型的数据成员
作者: Builder.com
2005-01-10 14:00:02


本文译自Builder.com,未经许可请勿转载

数据成员几乎总是一个实现细节。即使是在<code><complex></code> 这样的数字库中,通过将数据成员声明为 protected 或 public 来暴露数据是一个避免麻烦的办法。下面我将解释为什么 protected 类型的数据成员像 public 类型的数据成员一样糟糕。

Protected 类型数据成员的问题

当基类的实现发生变化时,能够访问基类 protected 类型数据成员的派生类也需要修改。这叫做耦合,耦合是面向对象的设计方法绝对需要避免的东西。

具体的例子

类complex 一般表示为一对浮点数据成员和一些额外的成员函数。它看上去似乎试图放弃传统的 get() 和 set() 成员函数,而赋予对这些成员的直接访问权。

template <class T> class complex
{
protected: //exposing data members to derived classes
 T real;
 T imaginary;
//..
};

这看上去像是一个故意的例子;然而,在 Standard Library 中确实存在具有 protected 类型数据成员的类。你可能会感到奇怪这么简单的类的设计会如何改变。一种方式是其他人可能使用一个数组代替了它的两个数据成员,如下所示:

template <class T> class complex
{
protected:
 T val[2];
//..
};

或者也有可能是一些人将这两个成员包装为一个tuple类型或者包装成一个对(pair)。在这两种情况下,派生类也需要修改。你可能会争论说这些成员是受保护的,而不是公有的;因此,设计变化就只会影响派生类。问题是 protected 类型的数据成员引诱程序员滥用继承来获得对数据成员的直接访问。

结束语

你应该避免使用 protected 类型的数据成员,因为他们会造成对封装的一个错误的理解。相反,将数据成员声明为 private 类型并定义相应的成员函数来访问它们是必要的。通过使用这种方法,基类设计上的变化就不会影响其它类。此外,它也不会引诱程序员使用继承获得对数据成员的直接访问。最重要的是,基类的所有者可以自由地改变基类的实现,同时又保持原有接口不变,而不至引起检查所有的代码。


Danny Kalev是一个具有14年经验的系统分析家、软件工程师,尤其擅长C++ 和面向对象设计。


责任编辑:李宁

欢迎评论投稿

声明:
Builder.com.cn(原ZDNet China应用开发频道)原创文章版权所有,未经许可严禁转载,且不构成投资建议。
近期相关报道:
实用技术文档
J2me XML
C/C++ C#
Java Oracle
Mysql .Net
VB.NET CSS
SQL Server 数据库
SQL UNIX
Linux Jsp
PHP Perl
Javascript IIS
XHTML ColdFusion
ASP/ASP.NET Apache
AJAX
订阅技术邮件
订阅"技术圈"杂志!请在下面选择您感兴趣的专题,填写e-mail地址,然后按订阅按钮:
应用开发管理
VS.NET 周刊
Database 周刊
WEB Service周刊
JAVA 周刊
IT 认证
Windows服务器周刊
互联网开发
当Windows Server 2008专家得5000元现金大奖
Copyright (c) 2006 CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
ZDNet 公司标识是 CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号