免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17642 | 回复: 50
打印 上一主题 下一主题

[C] 口水问题,纯C怎么做设计 [复制链接]

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-08 16:56 |只看该作者 |倒序浏览
本帖最后由 egmkang 于 2010-04-10 17:17 编辑

声明一下,这是口水问题,不喜欢别喷,谢谢.

我想知道用纯C怎么做设计,比如说C++里面很好使的多态(也是众多设计模式所必须的),这些东西在C++本来很好使,到了纯C里面,需要怎么模拟?
还是本来就有另外的解法?

忘众仙帮小鬼解答,谢谢

PS:
我是一个Windows程序员,来这里混只是开阔眼界,只希望大家不吝赐教.

论坛徽章:
0
2 [报告]
发表于 2010-04-08 17:03 |只看该作者
离开OO,设计模式就干不了活了吗?Unix,Linux内核还不是活得好好的?
没有多态就用函数指针;没有is-a继承,用struct has-a照样自在
最重要是模块和职责划分清晰,结构合理。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
3 [报告]
发表于 2010-04-08 17:05 |只看该作者
离开OO,设计模式就干不了活了吗?Unix,Linux内核还不是活得好好的?
没有多态就用函数指针;没有is-a继承 ...
gz80 发表于 2010-04-08 17:03


就是划分和关注依赖了?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2010-04-08 17:10 |只看该作者

  1. typedef struct X_ {
  2.       void (*f1)(struct X_** self, int);
  3.       int  (*f2)(struct X_** self, double);
  4. } X;

  5. void X_f1(X** self, int i) {
  6.       (*self)->f1(self, i);
  7. }

  8. int X_f2(X** self, double d) {
  9.       return (*sefl)->f2(self, d);
  10. }


  11. typedef struct {
  12.       X* vptr;
  13.       .. data
  14. } Y;

  15. void Y_f1(X** self, int i) {
  16.       Y* y = (Y*)( (char*)self - offsetof(Y,vptr) );
  17.       // work with y->data and i
  18. }

  19. int Y_f2(X** self, double d) { ... }

  20. X Y_vtbl = { Y_f1, Y_f2 };

  21. void Y_ctor(Y* y) {
  22.       y->vptr = &Y_vtbl;
  23.       // init y->data
  24. }

  25. Y* y = malloc( sizoef *y );
  26. Y_ctor(y);
  27. X** i = &y->vptr;
  28. X_f1(i);
  29. X_f2(i);

复制代码
确实是相当嘀麻烦……


这还好, 能搞出来……
template怎么搞啊……

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
5 [报告]
发表于 2010-04-08 17:12 |只看该作者
确实是相当嘀麻烦……


这还好, 能搞出来……
template怎么搞啊……
OwnWaterloo 发表于 2010-04-08 17:10


OwnWaterloo 大神啊
这玩意儿看的眼花缭乱

PS:
template我从来都不用的,不会用...汗

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2010-04-08 17:16 |只看该作者
回复 5# egmkang

上面的代码就和下面C++代码的流行实现相同:

  1. struct X {
  2.       virtual void f1(int);
  3.       virtual int  f2(double);
  4. };

  5. class Y : public X {
  6.       ... data
  7. public:
  8.       void f1(int);
  9.       int  f2(double);
  10. }

  11. Y* y = new Y;
  12. X* x = y;
  13. x->f1(1212);
  14. x->f2(3.26);

复制代码

论坛徽章:
0
7 [报告]
发表于 2010-04-08 17:34 |只看该作者
回复 3# egmkang


    嗯,所谓什么“开闭原理”,“高内聚,低耦合”等都是设计的思路和原则,采用C++或Java,偶只是具体的实现之一罢了。
就像说话要突出重点,简单利索是原则,管你是用汉语还是用鸟语。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [报告]
发表于 2010-04-08 17:53 |只看该作者
回复  egmkang


    嗯,所谓什么“开闭原理”,“高内聚,低耦合”等都是设计的思路和原则,采用C++或 ...
gz80 发表于 2010-04-08 17:34



但是像LSP,DIP    怎么搞?

论坛徽章:
0
9 [报告]
发表于 2010-04-08 19:59 |只看该作者
指针搞定一切
哈哈

论坛徽章:
0
10 [报告]
发表于 2010-04-08 23:03 |只看该作者
学过一门课 程序设计方法学

不知道靠谱不
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP