创建如下文件目录 :

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实现面向对象之接口编程的更多相关文章

  1. 面向对象、接口编程的重要性 python 为什么引入接口interface

    面向对象编程的实践 有个产品,其有10个子产品,现在要统计每日消费数据其中8个子产品的消费入账金额算法相同,2个不同; 拓展性差的糟糕的代码 def ConsumptionSum(product): ...

  2. 【GoLang】golang 面向对象编程 & 面向接口编程

    005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...

  3. 针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 某公司...打印机...(笔试中遇到的题目)

    针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求.         举个例子:某公司有一台特殊打印机,还可以使用一年,一年后可能换为另一种打印机,这两种打印机都特殊而贵. ...

  4. Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程

    Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程 这里的函数式编程的设计以muduo为例进行对比说明: Reactor实现架构对比 面向对象的设计类图如下: 函数式编程以muduo为例 ...

  5. JavaScript学习笔记-面向对象的模块化编程

    面向对象的模块化编程 模块是一个独立的JS文件,模块文件可以包含一个类定义.一组相关的类.一个实用函数库.一些待执行的代码 模块化的目标:支持大规模的程序开发,处理分散源代码的组装,并能让代码正确执行 ...

  6. javascript设计模式学习之十七——程序设计原则与面向接口编程

    一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...

  7. go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?

    到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...

  8. python之面向对象设计、编程

    面向对象 一.编程三个范式 1.面向过程编程 2.函数式编程 数学层面的函数 python中的函数编程 3.面向对象编程 二.面向对象设计 1.类:把一类事物共同的特征和共同的动作整合在一起就是类: ...

  9. Python 中的面向接口编程

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...

随机推荐

  1. Web Application Vulnerabilities and Potential Problem Due to Bad Design

    web应用设计中不安全的设计及潜在的风险: REF: https://msdn.microsoft.com/en-us/library/ff648647.aspx

  2. Cpython解释器支持的线程

    因为Python解释器帮你自动定期进行内存回收,你可以理解为python解释器里有一个独立的线程,每过一段时间它起wake up做一次全局轮询看看哪些内存数据是可以被清空的,此时你自己的程序 里的线程 ...

  3. camera摄像原理之四:曝光和GAMMA【转】

    转自:http://blog.csdn.net/ghostyu/article/details/7912880 从最明亮到最黑暗,假设人眼能够看到一定的范围,那么胶片(或CCD 等电子感光器件)所能表 ...

  4. CentOS RabbitMQ安装

    1. 安装erlang,参考另外一篇文章: http://www.cnblogs.com/wanpengcoder/p/5287302.html 2. 安装libxslt和: yum install ...

  5. Charles Android 抓包失败SSLHandshake: Received fatal alert: certificate_unknown

    前提: Android使用Charles抓取Https请求的报文时,Android和Charles都正确安装了证书之后出现抓包失败,报错SSLHandshake: Received fatal ale ...

  6. [ Python - 3 ] python3.5中不同的读写模式

    r 只能读.r+可读可写,不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆盖整个文件不存在则创建w ...

  7. python 金字塔图形

    a = 50 y = '*'*(a+1) p = ' ' while a: print(y) y = y[:a-1] y = p + y a = a - 1 for i in range(20): p ...

  8. libev 学习使用

    libev 简单的I/O库.  a high performance full featured event loop written in c libev 的大小也比 libevent 小得多并且自 ...

  9. SQL查询中in和exists的区别分析

    select * from A where id in (select id from B); select * from A where exists (select 1 from B where ...

  10. MYSQL的内外连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...