电子工程师技术服务社区
- 社区
- 论坛
- 综合技术专区
- 面向对象裸程序的例子≡显示器控制程序[连载九]
面向对象裸程序的例子≡显示器控制程序[连载九]
-
-
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--;
}
}
上帖说到的对于对象在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--;
}
}