“ 单片机如何面向对象,到底是不是多此一举?”
01
—
什么是面向对象编程
关于面向对象编程的定义网络上的介绍多如牛毛,大致有以下三个特性:封装,继承,多态
封装
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用父类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
多态
多态,是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
02
—
单片机如何面向对象
其实我们这里说的面向对象,实际上只是用来上述的第一个特性--封装,因为现在单片机都只能用C语言来进行编程,即使是micropython,底层的api也是用C语言封装起来的。而C语言本身就是一种面向过程的语言。所以在这里只能用到面向对象的封装特性,但是面向对象的思想却可以贯穿在整个编程过程中。
到底如何将面向对象的思想融入到单片机编程中呢,接下来我将会用几个例子来进行说明
03
—
用面向对象的思想实现按键功能
1、首先,我们想一下,常用的按键有哪些特性和动作,基本的有按下、松开、长按、短按、多击,那对应的操作是不是就可以定义为类似类函数的回调函数。所以我们先实例化一个按键结构体:
typedef struct
{
KeyAction keyActionCurr; /* 按键的当前动作状态 */
KeyAction keyActionPrev; /* 按键的上一个状态 */
uint8_t singleShotCount; /* 按键单击的次数*/
uint16_t pressTimeCount; /* 按键按下时间 */
uint16_t lossenTimeCount; /* 按键松开时间 */
uint16_t debounceTime; /* 按键去抖时间 */