面向对象裸程序的例子≡显示器控制程序[连载九]

  • US
  • LV5工程师
  • |      2016-03-31 18:42:18
  • 浏览量 425
  • 回复:1
上帖说到的对于对象在Keil C中的一些构造,用到了一些#define所进行的一些伪定义,这些定义其实并没有多少真正的意义,唯一的意义就是让我们的语言看起来更象个面向对象的语言。
    面向对象的语言中,变量或函数的作用域分成三类:public、private、protect。这分类主要是处理语言模块的封装问题,其直接表现的效果就是变量或函数能使用的范围。protect类型在我们这里可以不予考虑,因为我们并不十分强调继承关系,而只是统一都称为一种文档的组织关系#include。
    而对于public与private则还是有比较方便的办法实现的。对于public,我们可以使用extern来进行定义,或者什么定义都不带,在#include后面的范围内都是有效的。所以要定义一个public非常容易,只要做下列定义就可以了:
        #define  public
    或者
        #define  public  extern
    就可以了。
    对于作用域的限制,还有一个重要的限制就是哪些变量用什么办法约束起来,从而成为一个属主的私有成员。
    当然,这样的约束,写在一起,是个好办法。说实在的,只要你有足够的精力,即使不写在一起,只要不搞错,又有何不可?只是我们为了减少不必要的麻烦,所以我们总希望我们的代码只花我们尽量少的精力,那才是最理想的,那么我们就肯定要首先要求把它们写在一起,然后我们还希望它们不仅仅是只在一起,还希望编译器真正认为它们是被我们创建的某个对象私有的,那么我们就可以使用static来进行约束。全局静态变量或函数的定义,可以将该变量或函数的作用域限制在本文档内部,这就是一种私有性。因为我们完全可以做到在一个文档中只书写一个对象。因此我们就可以如定义public一样来定义 private:
        #define  private  static
    那么这样我们就可以为对象书写一些私有成员,如:
        private  UCH  soCursorPositionRow000 = 0;
        private  void  soSetCursorPosition000(void);
    如果我们并不想用这么多的private来限制这些成员,那么伪限制也是一种好办法,也就是说只是在书写格式上告诉看官,我的这段定义是私有成员,那么我们可以做如下的修改:
        #define  private
        #define  public

        private
            UCH  soCursorPositionRow000 = 0;
            void  soSetCursorPosition000(void);
        public
            void  soShowAChar000(void);
            void  soShowALine000(void);
    这样写没有定义任何变量的作用域,而只是为代码加上了一些欺骗眼球的伪码,这样做其实对程序实质没有任何帮助,但是得益的是我们程序设计的思想。也许我们只用了一两个很简练的伪码,却表达了很深奥很深奥的逻辑寓意——这是一段表达对象的代码,你不用做任何注解就明了的代码。这其实也正是思想的精髓所在,你把一团乱麻理顺了,你把一盘散沙促拢了。
    表达对象思想的书写中,封装是一个很重要的组织概念,封在一起的是一个整体,就如人家端个显示器给你一样,你不要管里头的电子束是怎么射出来的,一共有几颗螺丝钉固定着显象管,你所要关注的,只是那些接头和按钮。
    static在封装中还可以起另一个作用,就是为某一个功能封装一个隶属于该功能的局部变量,你可以对该变量进行初始化,但是你在实际应用中你不能感觉到它的存在,它的生命周期是无期的,但是拥有它的函数却可以生死轮回。下面是一个调节亮度的例子:
        #define  BRIGHTINC  1
        #define  BRIGHTDEC  0

        void  soAdjustBright000To(bit  BrightInc)
        {
            static  UCH  Bright = 32;  // 初始化:最大亮度为64,初始化亮度为32
            if(BrightInc)
            {  // 亮度增加
                if(Bright<64)  Bright++;
            }
            else
            {  //  亮度减少
                if(Bright)  Bright--;
            }
        }
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:1
US 2016-06-30
顶一下
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子