c++接口实现与分离(转载)

原文地址:http://www.360doc.com/content/13/0218/10/8363527_266294787.shtml

良好的设计应该只暴露接口给用户,所有的实现细节对用户来说应该是隐藏的,也就是说用户只要给接口传递相应的参数就行了,不需要管内部是如何实现的,比如我们使用fopen,fseek,CreateWindow等函数会发现很好用,而不需要管fopen,fseek,CreateWindow函数内部代码是如何实现的,数据结构是如何组织的,也就是说绝对不能暴露任何的细节给用户,包括数据组织在内。

我现在用C和C++举一个例子,来说说C/C++分别是如何实现的,然后来看看哪种实现更好。

先来看C++用类实现的封装:

--------------------------- interface1.h ---------------------------

#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 如何巧妙的封装以及隐藏实现细节:

---------------------------  interface.h  ---------------------------

#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++也可以做到只暴露接口给用户,不过实现起来会比较复杂,而且需要消耗更多的内存(使用了虚函数)。

-------------------------------------- parent.h --------------------------------------

#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;
}

时间: 2024-12-28 19:31:06

c++接口实现与分离(转载)的相关文章

C++中接口与实现分离的技术 ZZ

在用C++写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节.也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来.这个时候就要用到接口与实现分离的技术.    下面用一个最简单的例子来说明.    类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下:    lxTest.h文件内容: class ClxTest  {public:    ClxTest();    virtual ~Cl

设计模式六大原则(4):接口隔离原则(转载)

设计模式六大原则(4):接口隔离原则 定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 举例来说明接口隔离原则: (图1  未遵循接口隔离原则的设计) 这个图的意思是:类A依赖接口I中的方法1.方法2.方法

深入理解JavaScript系列(21):SOLID五大原则之接口隔离原则ISP(转载)

深入理解JavaScript系列(21):SOLID五大原则之接口隔离原则ISP 前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/08/solid-javascript-the-interface-segregation-principle/注:这篇文章作者写得

Java _Map接口的使用(转载)

转载自:http://blog.csdn.net/tomholmes7/article/details/2663379.转载请注明原作者地址 Map Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.       Map的接口       Map---实现Map       Map.Entry--Map的内部类,描述Map中的按键/数值对.       SortedMap---扩展Map,使按键保持升序排列           关于怎么使用,一般是选择Ma

JQuery1.11版本对prop和attr接口的含义分离导致问题分析

prop 和 attr 接口 实验中, 在jquery1.7版本, attr("value")  和 val() 接口获取 input 控件的值, 都是一致的, 都是当前控件值. 但是 jquery1.11版本,已经将 这两个接口的返回值分离,  attr("value") 获取的是 控件的初始值(default value), 只有val()属性才能获取到 控件当前值, 例如 用户修改 了输入的值, 必须使用val()获取最新值. 对于 checkbox 和 ra

程序实践:接口与实现分离

我们将类定义和使用此类的客户代码分离,增强了软件的可复用性.而接口定义并标准化了人和系统等诸如此类事物彼此交互的方式.每个类定义包含了类的公有成员函数的完整定义及其私有数据成员声明.可是更好的软件工程是在类定义的外部定义成员函数,这样这些成员函数的实现细节对客户代码而言隐藏的,这种方式保证程序员不会写出依赖于类的实现细节的客户代码.否则,若类的实现更改,则客户代码将更可能"遭到损坏". GradeBook.h:使用函数原型定义类接口 // GradeBook.h GradeBook c

java抽象类和接口的区别(转载)

1.Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用. 如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点. 2.一个抽象类的实现只能由这个抽象类的子类给出,也就是

Java 终于有 Lambda 表达式啦~Java 8 语言变化&mdash;&mdash;Lambda 表达式和接口类更改【转载】

原文地址 en cn 下载 Demo Java? 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件要少得多.接口更改使得接口可以添加到现有接口中,同时又不会破坏与现有代码的兼容性.本文将了解这些更改是如何协同工作的. Java 8 的最大变化在于添加了对 lambda 表达式 的支持.Lambda 表达式是可按引用传递的代码块.类似于一些其他编程语言中的闭包:它们是实现某项功能的代码,可接受一个

[接口] 支付宝及时到帐接口使用详解[转载]

这两天写支付宝接口, 这个话题不新了, 因为很多人都 做过了, 在这里我说说我的看法吧, 先说一下实现其实支付宝公司已经给我们做的很好了, 只要少量的改动就OK了,只是有的程序员不太明天他们的动作流程而以,我就以及时到帐为例子来说了,呵呵 在这之前就大家先下载一下c#版的及时到帐代码 这里是下载地址http://club.alipay.com/read-htm-tid-9976972.html先看一下程序的结构吧<ignore_js_op> 支付宝有一个类文件叫 AliPay 是一些加密算法之