【C/C++学院】0804-C语言和设计模式(继承、封装、多态)

C++有三个最重要的特点,即继承、封装、多态。我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。

(1)继承性

1.  typedef struct _parent

2. {

3.      int data_parent;

4.

5.  }Parent;

6.

7.  typedef struct _Child

8. {

9.      struct _parent parent;

10.    int data_child;

11.

12.}Child;

在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。

(2)封装性

1.  struct _Data;

2.

3.  typedef  void (*process)(struct _Data* pData);

4.

5.  typedef struct _Data

6. {

7.      int value;

8.     process pProcess;

9.

10.}Data;

封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。

(3)多态

1.  typedef struct _Play

2. {

3.      void* pData;

4.     void (*start_play)(struct _Play* pPlay);

5.  }Play;

多态,就是说用同一的接口代码处理不同的数据。比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。

#include<stdio.h>
#include<stdlib.h>

struct cmd
{
	char *p;
	void(*prun)(struct cmd *pcmd);
	void(*pprint)(struct cmd *pcmd);

};
typedef  struct cmd  CMD;

void run(CMD *pcmd )
{
	system(pcmd->p);
}

void print(CMD *pcmd)
{
	printf("%s", pcmd->p);
}

struct newcmd
{
	struct cmd cmd1;
	int(*plength)(struct newcmd *pnewcmd);
};

int getlength(struct newcmd *pnewcmd)
{
	return strlen(pnewcmd->cmd1.p);//返回长度
}

void main()
{
	struct newcmd newcmd1;
	newcmd1.cmd1.p = "notepad";
	newcmd1.cmd1.pprint = print;
	newcmd1.cmd1.prun = run;
	newcmd1.plength = getlength;//初始化

	newcmd1.cmd1.pprint(&newcmd1.cmd1);
	newcmd1.cmd1.prun(&newcmd1.cmd1);
	printf("%d",newcmd1.plength(&newcmd1));
	system("pause");
}

void main1()
{
	CMD cmd1 = { "notepad", run, print };
	cmd1.pprint(&cmd1);
	cmd1.prun(&cmd1);

	system("pause");
}
#include<stdio.h>
#include<stdlib.h>

struct ren
{
	void(*pj)(struct ren *p);
};

struct nanren
{
	struct ren ren1;
	void(*pj)(struct nanren *p);
};

void nanrenya(struct nanren *pnan)
{
	printf("男人的虎牙");
}

struct nvren
{
	struct ren ren1;
	void(*pj)(struct nvren *p);
};
void nvrenya(struct nvren *pnv)
{
	printf("女人的baiya ");
}
void gettooth(struct ren *pren)
{
	printf("gogogogo");
}

void main()
{
	struct nanren  tansheng1;
	tansheng1.ren1.pj = gettooth;
	tansheng1.ren1.pj(&tansheng1.ren1);

	tansheng1.pj = nanrenya;
	tansheng1.pj(&tansheng1);

	struct nvren   ftansheng1;
	ftansheng1.ren1.pj = gettooth;
	ftansheng1.ren1.pj(&ftansheng1.ren1);
	ftansheng1.pj = nvrenya;
	ftansheng1.pj(&ftansheng1);

	getchar();
}

版权声明:本博客所有文章均为原创,欢迎交流,欢迎转载;转载请勿篡改内容,并且注明出处,谢谢!

时间: 2024-11-26 03:39:03

【C/C++学院】0804-C语言和设计模式(继承、封装、多态)的相关文章

OC语言学习 (六) 继承、多态,构造方法,description方法

声明父类Animal继承自NSObject Animal.h #ifndef oc_Animal_h #define oc_Animal_h @interface Animal : NSObject { @public int weight; } - (void)eat; //重写默认构造方法 - (id) init; //自定义构造方法 - (id) initWithWeight:(int)newWeight; @end #endif Animal.m #import <Foundation/

C语言的设计模式-单一职责

C语言的设计模式-单一职责 单一职责原则: 通常的定义是只专注于做一件事和仅有一个引起它变化的原因.对于接口.实现.函数级别往往我们比较容易关注单一职责,大家谈的也比较多,但对于返回值.参数可能不会有太多的人关注.但往往就是这些不符合单一职责原则的设计可能导致一些很难发现的BUG.看看下面这段代码: pBuf = (byte*)realloc( pBuf, size); if( pbBuf != NULL ) { TODO... } 可能很多人一眼看上去并没有什么问题,先让我们看看这个库函数的定

C语言的设计模式-接口隔离

C语言的设计模式-接口隔离 接口隔离: 定义为客户端不应该依赖它不需用的接口,在C语言中我们可以把头文件看成一个模块的接口,根据接口隔离原则也就是说这个头文件中只能包含外部需要的接口,但在实际的项目中往往头文件都不符合接口隔离原则. 1:内.外部接口的隔离:头文件中通常包含了模块内部接口(内部类型定义.内部接口声明)和外部接口(外部接口声明) 假设moudle模块对外提供一个fun1接口,模块内部实现需要定义一个结构类型,一般的实现如下: /*moudle.h*/typedef struct s

C语言的设计模式-面向对象机制的实现(一)

C语言的设计模式-面向对象机制的实现(一) 为什么要用C来模拟面向对象的机制,在实际的工作中我们往往在感慨一些面向对象的经典设计模式由于C语言的限制无法使用,其实通过简单的模拟面向对象的行为,在C语言中也可以使用这些模式. 1:类的构建 类描述了所创建的对象共同的属性和方法.我们在一个源文件中通过把数据和操作进行适当的组织来完成类的模拟. /*类的数据*/typedef struct SQUARE_S SQUARE_T; struct SQUARE_S { void (*draw)(void*)

模块的封装之C语言类的继承和派生

[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我们将 在此的基础上介绍C语言类的继承和派生.其实继承和派生是一个动作的两种不同角度的表达 .当我们继承了一个基类而创造了一个新类时,派生的概念就诞生了.派生当然是从基类派生的.派生出来的类当然是继承了基类的 东西.继承和派生不是一对好基友,他们根本就是一个动作的两种不同的说法,强调动作的起始点的时候

黑马程序员——OC语言继承与多态

一)继承基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). 在这里动物是猫类和狗类的父类,黑猫和白猫类是猫类的子类. >>继承的好处: (1)抽取出了重复的代码 (2)建立了类和类之间的联系 >>继承的缺点: 耦合性太强 二)继承格式 @interface Animal:NSObject //动物里继承了NSObject,获得NSObject类的方法: @e

c语言中继承和多态的简单实现

C语言本身是不支持继承和多态的,但其实在 C 的世界里,有一套非常有名的面向对象的框架,用的也非常广,那就是 GObject,它是整个图形界面开发库 GTK 的基石,在IBM developerWorks上有一篇很好的文章介绍 GObject<GObject对象系统>.另外,在 Linux 内核里面也大量使用了面向对象的思想,比如虚拟文件系统,设备驱动等模块,在 lwn上有两篇文章就讲到了内核中的面向对象,详细请看:<Object oriented design patterns in

C语言实现C++的继承和多态

C++语言的对象化模型 .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 本文描述了一个C++实现的继承和多态的场景,然后用C语言编写了一种对等的实现. // A typical example of inheritance and virtual function use. // We would be mapping this code to equivalent C. // Prototype graphics library function to draw a circ

C++语言学习(九)——多态

C++语言学习(九)--多态 C++中所谓的多态(polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应.    多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性.可以减轻系统升级,维护,调试的工作量和复杂度. 多态是一种不同层次分类下的重要联系,是一种跨层操作. 一.多态实现的前提 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.赋值兼容是一种默认行为,不需要任何的显式的转化步骤,只能发生在public继承方式中,是多态