c++接口实现与分离(转载)
原文地址:http://www.360doc.com/content/13/0218/10/8363527_266294787.shtml
良好的设计应该只暴露接口给用户,所有的实现细节对用户来说应该是隐藏的,也就是说用户只要给接口传递相应的参数就行了,不需要管内部是如何实现的,比如我们使用fopen,fseek,CreateWindow等函数会发现很好用,而不需要管fopen,fseek,CreateWindow函数内部代码是如何实现的,数据结构是如何组织的,也就是说绝对不能暴露任何的细节给用户,包括数据组织在内。
我现在用C和C++举一个例子,来说说C/C++分别是如何实现的,然后来看看哪种实现更好。
先来看C++用类实现的封装:
#ifndef INTERFACE1_H
#define INTERFACE1_H
class DATA
{
private:
int _i;
short _j;
public:
DATA();
~DATA();
void set(int i, short j);
void get(int* i, short* j);
};
#endif
--------------------------- interface1.cpp ---------------------------
#include "interface1.h"
DATA::DATA()
{
_i = _j = 0;
}
DATA::~DATA()
{
_i = _j = 0;
}
void DATA::set(int i, short j)
{
_i = i;
_j = j;
}
void DATA::get(int* i, short* j)
{
*i = _i;
*j = _j;
}
--------------------------- test.cpp ---------------------------
#include <stdio.h>
#include "interface1.h"
int main()
{
DATA data;
int i;
short j;
data.set(2, 3);
data.get(&i, &j);
printf("i = %d, j = %d\n", i, j);
return 0;
}
再来看 C 如何巧妙的封装以及隐藏实现细节:
#ifndef INTERFACE_H
#define INTERFACE_H
void* data_create();
void data_set(void* dummy, int i, short j);
void data_get(void* dummy, int* i, short * j);
void data_destroy(void* dummy);
#endif
--------------------------- interface.c ---------------------------
#include <stdlib.h>
struct DATA
{
int i;
short j;
};
void* data_create()
{
return malloc(sizeof(struct DATA));
}
void data_set(void* dummy, int i, short j)
{
struct DATA* data = dummy;
data->i = i;
data->j = j;
}
void data_get(void* dummy, int* i, short * j)
{
struct DATA* data = dummy;
*i = data->i;
*j = data->j;
}
void data_destroy(void* dummy)
{
free(dummy);
}
--------------------------- test.c ---------------------------
#include <stdio.h>
#include "interface.h"
int main()
{
int i;
short j;
void* data = data_create();
data_set(data, 2, 3);
data_get(data, &i, &j);
printf("i = %d, j = %d\n", i, j);
data_destroy(data);
return 0;
}
可以看的出来,C的实现只暴露了接口给用户,内部的实现细节都隐藏了起来,可是C++用类实现反而在头文件暴露了实现细节。
当然用C++也可以做到只暴露接口给用户,不过实现起来会比较复杂,而且需要消耗更多的内存(使用了虚函数)。
#ifndef PARENT_H
#define PARENT_H
class PARENT
{
public:
virtual void set(int i, short j) = 0;
virtual void get(int* i, short* j) = 0;
};
PARENT* get_child();
#endif
-------------------------------------- parent.cpp --------------------------------------
#include "parent.h"
#include "child.h"
PARENT* get_child()
{
return new CHILD;
}
-------------------------------------- child.h --------------------------------------
#ifndef CHILD_H
#define CHILD_H
#include "parent.h"
class CHILD : public PARENT
{
private:
int _i;
short _j;
public:
CHILD();
~CHILD();
void set(int i, short j);
void get(int* i, short* j);
};
#endif
-------------------------------------- child.cpp --------------------------------------
#include "child.h"
CHILD::CHILD()
{
_i = _j = 0;
}
CHILD::~CHILD()
{
_i = _j = 0;
}
void CHILD::set(int i, short j)
{
_i = i;
_j = j;
}
void CHILD::get(int* i, short* j)
{
*i = _i;
*j = _j;
}
-------------------------------------- test.cpp --------------------------------------
#include <stdio.h>
#include "parent.h"
int main()
{
int i;
short j;
PARENT* parent = get_child();
parent->set(2, 3);
parent->get(&i, &j);
printf("i = %d, j = %d\n", i, j);
return 0;
}
c++接口实现与分离(转载)的更多相关文章
- C++中接口与实现分离的技术 ZZ
最简单清晰的例子:http://www.cnblogs.com/maoye/archive/2010/03/19/1690183.html 接口与实现分离 为什么这样设计? 主要原因是保持接口的稳定, ...
- ZT 接口和实现分离
什么叫接口和实现分离,如何实现 [问题点数:20分,结帖人heronism] http://bbs.csdn.net/topics/310212385 http://blog.csdn.net/sta ...
- JQuery1.11版本对prop和attr接口的含义分离导致问题分析
问题背景 实验中, 在jquery1.7版本, attr("value") 和 val() 接口获取 input 控件的值, 都是一致的, 都是当前控件值. 但是 jquery1 ...
- Java _Map接口的使用(转载)
转载自:http://blog.csdn.net/tomholmes7/article/details/2663379.转载请注明原作者地址 Map Map以按键/数值对的形式存储数据,和数组非常相似 ...
- 使用swagger实现web api在线接口文档(转载)
一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...
- API接口测试用例编写规则(转载)
API接口测试用例编写规则 (1)必需参数覆盖.对于接口的参数,接口文档一般都会说明哪些儿是必需的,哪儿是非必需的.对于必需的参数,一定要测试传参数和不传参数接口是否报错? (2)必需的参数各种情况覆 ...
- Hessian 接口使用示例总结(转载)
一.使用hessian接口准备 首先,hessian接口的使用,必须要准备hessian接口的jar包,本文使用的jar包如下:hessian-4.0.7.jar; Hessian接口的使用一般是在两 ...
- yii 主从数据库分离-转载http://www.yiichina.com/doc/guide/2.0/db-dao
数据库复制和读写分离 很多数据库支持数据库复制 database replication来提高可用性和响应速度. 在数据库复制中,数据总是从主服务器 到 从服务器. 所有的插入和更新等写操作在主服务器 ...
- java抽象类和接口的区别(转载)
1.Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用. 如果向一个抽象类里加入 ...
随机推荐
- TestNG @Factory与 @DataProvider 结合使用进行参数化测试
简介 TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到集成测试,这个是TestNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试.设计目标的不同,对比junit的只适合用于单 ...
- install cx_Oracle on Linux
step 1 : install oracle client library url: http://www.oracle.com/technetwork/topics/linuxsoft-08280 ...
- guava – Optional
过多的使用null可能会导致大量的bugs,Google code 底层代码中,95%的集合类默认不接受null值.对null值,使用快速失败拒绝null比默认接受更好. 另外,null本身的含义很模 ...
- C#检测网卡和网络统计信息
using System; using System.Collections.Generic; using System.Net.NetworkInformation; public class My ...
- win7双系统安装ubuntu并配置常用软件
首先在win7下磁盘清理出来空间具体方法找度娘就行了. 下面开始准备安装: 1.下载easyBCD 2.打开:添加新条目--NeoGub--安装 3.点击配置 修改menu.lst title In ...
- .NET程序集的编译目标平台:X86 &AnyCPU &X64
在我们测试平台上发布客户端组件,经常会碰到因为build的版本是x86还是anycpu而引起的application error的问题.借此,研究了一下X86,X64,AnyCPU的区别. 使用.ne ...
- 迁移学习( Transfer Learning )
在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型:然后利用这个学习到的模型来对测试文档进行分类与预测.然而,我们看到机器学习算法在当前的Web挖掘研究中存在着一个关 ...
- Asp.net Core基于MVC框架实现PostgreSQL操作
简单介绍 Asp.net Core最大的价值在于跨平台.跨平台.跨平台.重要的事情说三遍.但是目前毕竟是在开发初期,虽然推出了1.0.0 正式版,但是其实好多功能还没有完善.比方说编译时的一些文件编码 ...
- 正则表达式test验证的“bug”
在使用正则表达式对某些字符串进行验证时,我们常常会使用到test方法,而该方法也隐藏着一个陷阱,今天就让我们来看一下这个问题. var str = 'hello jack, hello rose'; ...
- openstack vm_lifecycle
nova instance状态:power_state, vm_state, task_state 2015-09-22 Openstack 185 nova instance有3种状态:power_ ...