Hide Implementation Classes

Hide Implementation Classes

eryar@163.com

摘要:很多程序员都用过private来隐藏函数和成员变量,实际上有些类也是可以被隐藏起来的。本文是对《API Design for C++》中2.2.5的翻译,若不不当之处,欢迎指出。

关键字:API Design for C++, Hide Classes

除了可以隐藏类的变量与方法之外,还可以隐藏任意单纯实现细节的类。很多程序员都用过隐藏方法和变量,但是好多也好像忘记了并不是所有的类都是公有的。实际上,有些类只在你的实现中需要,而不应该作为公开的接口暴露出来。

例如,考虑一个简单的烟花(Fireworks)类:一个接口可以用来指定烟花在屏幕上位置,控制烟花的颜色、速度和烟花颗粒(particle)的数量。明显地,这个API就需要对烟花的每个颗粒进行追踪,以便于在每帧更新颗粒的位置。这暗示着需要引入一个用来保存每个颗粒状态的类FireParticle,但是这个API的用户并不需要访问这个类,它只在实现API时才需要。这样的类就可以设置为私有(private),即作为类Fireworks私有的部分。代码如下所示:

 

 1 /// -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: t -*-
 2 ///
 3 /// \file   fireworks.h
 4 /// \author Martin Reddy
 5 /// \brief  An illustration of using private classes.
 6 ///
 7 /// Copyright (c) 2010, Martin Reddy. All rights reserved.
 8 /// Distributed under the X11/MIT License. See LICENSE.txt.
 9 /// See http://APIBook.com/ for the latest version.
10 ///
11 
12 #ifndef FIREWORKS_H
13 #define FIREWORKS_H
14 
15 #include <vector>
16 
17 namespace apibook {
18 
19 ///
20 /// A simple fireworks particle system, used to demonstrate
21 /// the use of private classes to hide implementation state.
22 ///
23 class Fireworks
24 {
25 public:
26     Fireworks();
27 
28     /// Set the (x, y) origin of the fireworks effect
29     void SetOrigin(double x, double y);
30     /// Set the RGB color (0..1) for each particle
31     void SetColor(float r, float g, float b);
32     /// Set the gravity acting on each particle (meters/sec)
33     void SetGravity(float g);
34     /// Set the speed of the particle simulation
35     void SetSpeed(float s);
36     /// Set the number of particles in the simulation
37     void SetNumberOfParticles(int num);
38 
39     /// Start (or continue) the simulation
40     void Start();
41     /// Stop the simulation
42     void Stop();
43     /// Advance the simulation by dt seconds 
44     void NextFrame(float dt);
45 
46 private:
47     // FireParticle represents internal hidden state
48     // (You could also forward declare this class and
49     // only provide the definition in the .cpp file.)
50     class FireParticle
51     {
52     public:
53         double mX, mY;
54         double mVelocityX, mVelocityY;
55         double mAccelerationX, mAccelerationY;
56         double mLifeTime;
57     };
58 
59     double mOriginX, mOriginY;
60     float mRed, mGreen, mBlue;
61     float mGravity;
62     float mSpeed;
63     bool mIsActive;
64     std::vector<FireParticle *> mParticles;
65 };
66 
67 }
68 
69 #endif
70 

注意到在类FireParticle中我并没有使用getter/setter。只要你愿意,当然也可以这样做。但是也不是非常必要这么做,因为公有的接口是不能访问这个类的。有些工程师也比较喜欢使用struct来代替class,to reflect that the structure is a Plain Old Data(POD) type。

当然,你可能也想过隐藏类FireParticle,即在头文件中也不出现。我将在下一节中讲到怎样来实现。

 

PDF Version: Hide Implementation Classes

时间: 2024-10-31 10:35:27

Hide Implementation Classes的相关文章

OpenCASCADE Outline

OpenCASCADE Outline eryar@163.com      有网友反映blog中关于OpenCASCADE的文章比较杂乱,不太好找,最好能提供一个大纲,这样方便查找.于是决定将这些学习时写的文章整理下,方便对OpenCASCADE的学习理解.其实在http://www.cnblogs.com/opencascade中,已经将文章按目录重新发表了一遍.可以按OpenCASCADE的模块的顺序来学习,也可以挑选自己感兴趣的部分来学习.      由于本人水平所限,文中的错误不妥之处

iOS 中正则表达式使用方法汇总

iOS 中正则表达式使用方法汇总 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 某种语言中的正则工具算是木桶,而这个工具处理的是正则表达式,算是水,那么水很多,无论是淡水还是咸水,或是雨水,至

主流web容器(jetty,tomcat,jboss)的classloader机制对比和相关问题分析

背景      前段时间一直在做应用容器的迁移,将公司的应用容器从jboss,tomcat统一迁移到jetty.在整个迁移过程中遇到最多的潜在问题还是在classloader机制上,这里记录一下希望能对大家有所帮助,避免重复走弯路.   啥都不说,先来看下遇到的几个问题,比较纠结的问题. 问题1: (jar sealed问题) 1.Caused by: java.lang.SecurityException: sealing violation: package com.sun.media.ja

软件行为模型中的设计模式

Discovering design patterns in software behavior models Sandeep Mitra and T. M. Rao Department of Computing Sciences The College at Brockport, State University of New York Brockport, NY 14420 585 395-2234 smitra@brockport.edu 探索软件行为模型中的设计模式 Sandeep M

An Overview of RMI Applications

application An Overview of RMI Applications RMI applications are often comprised of two separate programs: a server and a client. A typical server application creates some remote objects, makes references to them accessible, and waits for clients to

【SpringMVC框架】非注解的处理器映射器和适配器

非注解的处理器映射器和适配器 1.非注解的处理器映射器 之前的处理器映射器: org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping <!-- 配置Handler --> <bean name="/queryItems_test.action" class="cn.edu.hpu.ssm.controller.ItemsController1" /> <!--

Supported method argument types Spring MVC

Supported method argument types The following are the supported method arguments: Request or response objects (Servlet API). Choose any specific request or response type, for example ServletRequest or HttpServletRequest. Session object (Servlet API):

Commons Logging存在的ClassLoader问题详解

在看Java Logging相关的框架.代码.资料的时候,一直有听说Commons Logging存在ClassLoader相关的问题,但是看它的实现代码(1.1.1版本),对ClassLoader做了非常详细的查找:用了Thread Context ClassLoader.System ClassLoader.以及LogFactoryImpl本身的ClassLoader,感觉上已经很全面了.上周末有幸找到一篇Ceki Gülcü写文章,详细介绍了Commons Logging中存在的Class

Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)

  Acknowledgments I would like to thank Jacob Kjome for reviewing early drafts of this document. His comments helped to clarify several important points. Jake also keeps reminding us on the log4j-dev mailing list that the child-parent delegation mode