纯C实现面向对象之接口编程
创建如下文件目录 :
Shape.h
#include <stdlib.h>
//接口
#ifndef Interface
#define Interface struct
#endif
//类
#ifndef Class
#define Class struct
#endif
//SHAPE_H_
#ifndef SHAPE_H_
#define SHAPE_H_
//抽象形状类
Class Shape;
typedef Class Shape * p_shape;
//抽象形状类声明
Class Shape
{
int edge;
int (*getEdge)(p_shape shape);
int (*calcArea)(p_shape shape);
}; //形状类构造函数
p_shape Shape(int edge);
//形状类析构函数
void _Shape(void * shape);
//形状类实例方法
int Shape_getEdge(p_shape shape);
//形状类抽象方法,返回-1,表示未实现
int Shape_calcArea(p_shape shape); #endif /* SHAPE_H_ */
Shape.c
#include "Shape.h" p_shape Shape(int edge)
{
p_shape obj = (p_shape) malloc(sizeof(Class Shape));
obj->edge = edge;
obj->getEdge = Shape_getEdge;
obj->calcArea = Shape_calcArea;
return obj;
} void _Shape(void * obj)
{
if (NULL != obj)
{
free(obj);
}
} int Shape_getEdge(p_shape shape)
{
return shape->edge;
} int Shape_calcArea(p_shape shape)
{
return -;
}
Triangle.h
#include "Shape.h" #ifndef TRIANGLE_H_
#define TRIANGLE_H_
//三角形类
Class Triangle;
typedef Class Triangle * p_triangle;
//三角形类声明
Class Triangle
{
int bottom;
int height;
p_shape super;
int (*getEdge)(p_triangle triangle);
int (*calcArea)(p_triangle triangle);
}; //三角形类构造函数
p_triangle Triangle(int bottom, int height);
//三角形类析构函数
void _Triangle(void * triangle);
//三角形类实例方法
int Triangle_getEdge(p_triangle triangle);
//三角形类实例方法,重写父类同名方法
int Triangle_calcArea(p_triangle triangle); #endif /* TRIANGLE_H_ */
Triangle.c
#include "Shape.h"
#include "Triangle.h" p_triangle Triangle(int bottom, int height)
{
p_triangle obj = (p_triangle) malloc(sizeof(Class Triangle));
obj->bottom = bottom;
obj->height = height;
obj->super = Shape();
obj->getEdge = Triangle_getEdge;
obj->calcArea = Triangle_calcArea;
return obj;
} void _Triangle(void * triangle)
{
if (NULL != triangle)
{
free(triangle);
}
} int Triangle_getEdge(p_triangle triangle)
{
return triangle->super->edge;
} int Triangle_calcArea(p_triangle triangle)
{
return triangle->bottom * triangle->height / ;
}
Rectangle.h
#include "Shape.h"
#ifndef RECTANGLE_H_
#define RECTANGLE_H_
//矩形类
Class Rectangle;
typedef Class Rectangle * p_rectangle; //矩形类声明
Class Rectangle
{
int bottom;
int height;
p_shape super;
int (*getEdge)(p_rectangle rectangle);
int (*calcArea)(p_rectangle rectangle);
}; //矩形类构造函数
p_rectangle Rectangle(int bottom, int height);
//矩形类析构函数
void _Rectangle(void * rectangle);
//矩形类实例方法
int Rectangle_getEdge(p_rectangle rectangle);
//矩形类实例方法,重写父类同名方法
int Rectangle_calcArea(p_rectangle rectangle); #endif /* RECTANGLE_H_ */
Rectangle.c
#include "Shape.h"
#include "Rectangle.h" p_rectangle Rectangle(int bottom, int height)
{
p_rectangle obj = (p_rectangle) malloc(sizeof(Class Rectangle));
obj->bottom = bottom;
obj->height = height;
obj->super = Shape();
obj->getEdge = Rectangle_getEdge;
obj->calcArea = Rectangle_calcArea;
return obj;
} void _Rectangle(void * rectangle)
{
if (NULL != rectangle)
{
free(rectangle);
}
} int Rectangle_getEdge(p_rectangle rectangle)
{
return rectangle->super->edge;
} int Rectangle_calcArea(p_rectangle rectangle)
{
return rectangle->bottom * rectangle->height;
}
Main.c
#include "Shape.h"
#include "Triangle.h"
#include "Rectangle.h"
#include <stdio.h> int main()
{
p_triangle triangle = Triangle(, );
printf("%d\n", triangle->getEdge(triangle));
printf("%d\n", triangle->calcArea(triangle));
_Triangle(triangle); p_rectangle rectangle = Rectangle(, );
printf("%d\n", rectangle->getEdge(rectangle));
printf("%d\n", rectangle->calcArea(rectangle));
_Rectangle(rectangle); return ;
}
编译运行,结果如下:
纯C实现面向对象之接口编程的更多相关文章
- 面向对象、接口编程的重要性 python 为什么引入接口interface
面向对象编程的实践 有个产品,其有10个子产品,现在要统计每日消费数据其中8个子产品的消费入账金额算法相同,2个不同; 拓展性差的糟糕的代码 def ConsumptionSum(product): ...
- 【GoLang】golang 面向对象编程 & 面向接口编程
005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...
- 针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 某公司...打印机...(笔试中遇到的题目)
针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 举个例子:某公司有一台特殊打印机,还可以使用一年,一年后可能换为另一种打印机,这两种打印机都特殊而贵. ...
- Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程
Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程 这里的函数式编程的设计以muduo为例进行对比说明: Reactor实现架构对比 面向对象的设计类图如下: 函数式编程以muduo为例 ...
- JavaScript学习笔记-面向对象的模块化编程
面向对象的模块化编程 模块是一个独立的JS文件,模块文件可以包含一个类定义.一组相关的类.一个实用函数库.一些待执行的代码 模块化的目标:支持大规模的程序开发,处理分散源代码的组装,并能让代码正确执行 ...
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...
- python之面向对象设计、编程
面向对象 一.编程三个范式 1.面向过程编程 2.函数式编程 数学层面的函数 python中的函数编程 3.面向对象编程 二.面向对象设计 1.类:把一类事物共同的特征和共同的动作整合在一起就是类: ...
- Python 中的面向接口编程
前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
随机推荐
- Python学习笔记 - day4 - 流程控制
Python流程控制 Python中的流程控制主要包含两部分:条件判断和循环. Python的缩进和语法 为什么要在这里说缩进和语法,是因为将要学习的条件判断和分支将会涉及到多行代码,在java.c等 ...
- gdb 调试 ncurses 全过程:
转载地址: http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU ...
- Oracle基础 08 用户角色 user/role
--查询帐户的状态select username,account_status from dba_users where username='SCOTT'; --创建用户create user jo ...
- easyui时间控件用js实时获取选定的时间的取法
easyui时间控件用js实时获取选定的时间的取法var datetime=$("#id").datetimebox("getValue");不能用 $(& ...
- pipreqs------查找python项目依赖并生成requirements.txt
项目开发的时候,总是要搭建和部署环境,这时,就需要一个python第三方包的list,一般叫做requirements.txt.如果项目使用virtualenv环境,直接使用pip freeze即可, ...
- python与鸭子类型
部分参考来源:作者:JasonDing https://www.jianshu.com/p/650485b78d11##s1 首先介绍下面向对象(OOP)的三大特征: (1)面向对象程序设计有三大特 ...
- eps图片中有中文乱码的问题
一般的,如果matlab中的fig图片中有中文,直接saveas为eps,eps再插入latex后会出现乱码. 解决的办法为: (1) *.fig利用‘file--print’保存为*.pdf (2) ...
- 如何调用docker swarm service的API来创建及更新服务
平衡的推进,先作一个原型吧. #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json #定义docker s ...
- 使用Rancher管理Docker
使用命令: sudo docker run -it -d --restart=always -p : --name docker-rancher rancher/server 为了更快速的下载应用,推 ...
- 【Linux命令】du -h --max-depth=1 /usr/local/
查看文件夹中各文件(夹)的大小 例如 du -h --max-depth=1 /usr/local/ 应用:比如mysql 无法启动,提示:ERROR! Manager of pid-file qui ...