200分求类(class)封装技巧

离子漂浮物 2004-06-17 09:37:35
对于class的接触有好一段时间了,但是对封装的概念还是很模糊。往往作出来的class局限太大,有时回头看看程序,感觉还不如不用class的好。很明显就是封装的功力没到家,请大家将自己在class抽象和封装过程中的心得发布交流一下。


以上是ASP版贴的原文转发。

小生是从事ASP开发的,之所以在这里发贴是想到关于class方面的技巧,在C/C++的开发前辈们会更多的心得和想法,请大家不要笑话我。

我只能在这个版区给100分,如果不够可以另开贴给分。只要大家支持我。
...全文
227 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
离子漂浮物 2004-06-30
  • 打赏
  • 举报
回复
GOF,先去看看,有什么不明白的,还得请各位多多指点啊。
sharkhuang 2004-06-26
  • 打赏
  • 举报
回复
GOF
NewKUN 2004-06-26
  • 打赏
  • 举报
回复
越学越做 越觉得该完善的地方很多...
Wolf0403 2004-06-26
  • 打赏
  • 举报
回复
类的设计应该尽量贴近问题领域,描述、解决问题中最小最不(可|宜)分割的一个概念;以此为基础之上适当考虑代码的可重用性质;而不应该把所谓的“灵活”放在第一位,这样才能写好的代码,类的封装才有它的意义。
——基本节选自 C++ Gochars 和 C++ 沉思录
hcj2002 2004-06-24
  • 打赏
  • 举报
回复
尽量让类完成单一(想对与泪本身而言)的功能,不要奢望一个类能完成所有的工作。
kaphoon 2004-06-24
  • 打赏
  • 举报
回复
设计模式,是设计类时的经验集合,
所以建议楼主学习
step_by_step 2004-06-24
  • 打赏
  • 举报
回复
推荐你看看《Design Patterns Explained》然后再看gof的设计模式。然后多实践。
bm1408 2004-06-24
  • 打赏
  • 举报
回复
软件工程说要做到高人聚,低媾和!我想类也是如此!
darkstar21cn 2004-06-24
  • 打赏
  • 举报
回复
主要是在实践中不断的总结,别作完之后就把代码掉在一边了。
另外可以进行必要的重构,可以提高代码的重用
JacksonFox 2004-06-24
  • 打赏
  • 举报
回复
嗯。多学多练,加深理解。
leyt 2004-06-24
  • 打赏
  • 举报
回复
多学,多用
langzi8818 2004-06-24
  • 打赏
  • 举报
回复
我看这个只有、自己都实践了,
qwertasdfg123 2004-06-24
  • 打赏
  • 举报
回复
如楼上所说。
多学习
MyNameEPC 2004-06-24
  • 打赏
  • 举报
回复
上面最后的Select()函数应该改成下面样子,上面把参数int忘写了,呵呵!!
Data* Select(int id)
{
// your implementation
}
MyNameEPC 2004-06-24
  • 打赏
  • 举报
回复
其实类的设计很广泛的,就先举一个多态的例子吧。下面的例子假设用户要进行数据库操作,这个数据库中的表有三个字段,分别是id、name、gender;而且这个项目要求能够同时操作世面上的多种数据库,比如Sql Server、Oracle、My Sql等等。可是程序最好能够有通用性,所以我们就利用多态来实现!

class DbAccess // 先利用纯虚函数还定义接口
{
public:
virtual void Insert(char *name, bool gender) = 0;
virtual void Update(int id, char *name, bool gender) = 0;
virtual void Delete(int id) = 0;
virtual void Select(int id, char *name, bool *gender) = 0;
};

class SqlAccess : public DbAccess // 对Sql Server的操作
{
public:
virtual void Insert(char *name, bool gender)
{
// your implementation
}
virtual void Update(int id, char *name, bool gender)
{
// your implementation
}
virtual void Delete(int id)
{
// your implementation
}
virtual void Select(int id, char *name, bool *gender)
{
// your implementation
}
};

class OracleAccess : public DbAccess // 对Oracle的操作
{
public:
virtual void Insert(char *name, bool gender)
{
// your implementation
}
virtual void Update(int id, char *name, bool gender)
{
// your implementation
}
virtual void Delete(int id)
{
// your implementation
}
virtual void Select(int id, char *name, bool *gender)
{
// your implementation
}
};

class MySqlAccess : public DbAccess // 对My Sql的操作
{
public:
virtual void Insert(char *name, bool gender)
{
// your implementation
}
virtual void Update(int id, char *name, bool gender)
{
// your implementation
}
virtual void Delete(int id)
{
// your implementation
}
virtual void Select(int id, char *name, bool *gender)
{
// your implementation
}
};

enum DbType { SqlServer, Oracle, MySql };

DbType GetDbType()
{
return SqlServer; // 我们先实现对Sql Server的操作(我最熟悉这个,呵呵)
}

int main(
{
DbAccess *pAccess = NULL;
switch(GetDbType())
{
case SqlServer:
pAccess = new SqlAccess();
break;
case Oracle:
pAccess = new OracleAccess();
break;
case MySql:
pAccess = new MySqlAccess();
break;
default:
cout<<"Yet not supported!"<<endl;
}
// now, you have gotten a DB Access pointer, you can do what you want to do!
delete pAccess;
return 0;
}

Okey!这次就说到这里,其实上面的例子还可以再包装,将数据和操作进一步分离开来,提个醒,如我们修改Select()函数:
struct Data
{
int id;
char *name;
bool gender;
// 别忘了在自己的程序里写一个析构函数,释放name占用的内存,再写一个拷贝构造函数!
};

Data* Select(id)
{
// your implementation
}
oo 2004-06-24
  • 打赏
  • 举报
回复
csdn帖子提前的功能有问题。
你提的问题太大了,都可以写成一本书了,呵呵...
多看书,多做,经验多了就好了。
离子漂浮物 2004-06-24
  • 打赏
  • 举报
回复
人工提贴...

这贴子提前怎么都过了几天了还提得太繁忙呢???
icenl 2004-06-24
  • 打赏
  • 举报
回复
摸索中......
flyerlxg 2004-06-24
  • 打赏
  • 举报
回复
得跟前辈们好好学学!
QunKangLi 2004-06-24
  • 打赏
  • 举报
回复
<大规模C++程序设计>专讲这个问题,买前先准备80大洋!
加载更多回复(2)

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧