纯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 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
随机推荐
- glib windows下编译
记录的比较粗糙,但是绝对可行的 一些小的瑕疵以后再解决吧 (android版本的过几天再贴,移植到android已经通过) msys+mingw包下载: http://sourceforge.net/ ...
- JS实现上下左右对称的九九乘法表
JS实现上下左右对称的九九乘法表 css样式 <style> table{ table-layout:fixed; border-collapse:collapse; } td{ padd ...
- cobbler部署安装
挂载光驱 # mount /dev/cdrom /mnt/ 安装cobbler所需软件 # yum install cobbler cobbler-web dhcp tftp-server pykic ...
- 前段基础JavaScript
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...
- Annotation(注解)代替配置文件
非注解形式,即指在配置文件中配置相关参数,使实体类.参数各方面分离.注解方式,即annotation方式,是jdk提供的一种注入或配置方式.即将实体类与相关参数都在一起,只是通过@annotation ...
- 构建maven动态web 工程
项目构建 总体参考: http://www.java2blog.com/2015/09/how-to-create-dynamic-web-project-using.html https://sta ...
- hdu5739
以前从来没写过求点双连通分量,现在写一下…… 这题还用到了一个叫做block forest data structure,第一次见过…… ——对于每一个点双联通分量S, 新建一个节点s, 向S中每个节 ...
- Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)
#include <stdio.h> #include <string.h> ][]; ]; ]; int main(){ scanf(]); scanf(]); scanf( ...
- UVALive - 3211 (2-SAT + 二分)
layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...
- 单词接龙(dragon)(BFS)
单词接龙(dragon) 时间限制: 1 Sec 内存限制: 64 MB提交: 12 解决: 5[提交][状态][讨论版] 题目描述 单 词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已 ...