创建如下文件目录 :

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. Oracle 11g 安装环境配置脚本

    #!/bin/bash #Test in RHEL 5.5 for 11g c=`cat /etc/shadow | grep oracle | wc -l`if [ $c != 0 ]then  w ...

  2. java servlet输出数据

    httpServletResponse.setContentType("text/html;charset=UTF-8"); httpServletResponse.getWrit ...

  3. 2.RDD的基本操作

    有些时候,我不太喜欢介绍相关概念什么的(其实是你懒吧),而是喜欢直接介绍用法. 所以RDD是什么这里也不再介绍了,可以自行百度,下面直接介绍rdd的一些操作 from pyspark import S ...

  4. k8s的回滚应用

    kubectl apply 每次更新应用时 Kubernetes 都会记录下当前的配置,保存为一个 revision(版次),这样就可以回滚到某个特定 revision. 默认配置下,Kubernet ...

  5. hdu 5748(LIS)

    Bellovin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  6. 2017中国大学生程序设计竞赛 - 女生专场A【模拟】

    A HDU - 6023 [题意]:求AC题数和总时长. [分析]:模拟.设置标记数组记录AC与否,再设置错题数组记录错的次数.罚时罚在该题上,该题没AC则不计入总时间,AC则计入.已经AC的题不用再 ...

  7. HDU 1066 Last non-zero Digit in N!(数论,大数,wait)

    The expression N!, read as "N factorial," denotes the product of the first N positive inte ...

  8. 队列 P1160 队列安排(啊啊 不会啊)

    洛谷 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为 ...

  9. 12、Flask实战第12天:子域名

    什么是子域名,我们的后台管理系统, 比如cms.heboan.com.配置子域名需要用到蓝图技术: 我现在buleprints下面创建一个cms.py 蓝图 from flask import Blu ...

  10. ASP.NET Core 2.2 基础知识(一) 依赖注入

    依赖: 类A用到了类B,我们就说类A依赖类B.如果一个类没有任何地方使用到,那这个类基本上可以删掉了. public class Test { private MyDependency md = ne ...