网上oopc实现方式都能搜得到,如oopc参考文章,rtt的oopc也是基本一样。大家好像都有个共识了:
(1)定义类都用struct——这一过程就是抽象封装的过程,把属性和方法封装到struct里面,方法用函数指针变量表示,其他作为属性。
(2)继承的实现都是结构体套结构体,且父类都是放在子类结构体的首位成员。
(3)每定义一类,都要编写该类对应的构造函数(初始化函数),析构函数可以没有(反初始化函数)。
(4)子类构造函数里重写父类方法。如何实现?通过给父类方法赋值的方式。
这样就实现了面向对象的抽象、封装、继承、多态的特性。
为什么要这么做呢?这样的好处是什么?这样遵循了对内封闭,对外开放的软件设计原则(设计模式就是这么来的)。简单点来说,扩展性好(如搭积木似的),好管理,稳定性强。
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值——它这个结构体是包含一个个的结构体——模拟的是面向对象的继承机制。跟套娃似的,层层进行初始化。
每层有每层的初始化(构造)函数,就模拟了面向对象的构造函数——按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。
其实每个类的注册函数模拟的是面向对象的构造函数。
其构造函数的实质,是对结构体进行初始化,在C中没有面向对象语言层面的机制,只能采用结构体套用结构体来模拟,这样原先定义好的结构体以及其对象构造函数对新扩展的(包含它的)结构体是解耦的,你新增一个新扩展(包含它的)新结构体,初始化它(面向对象叫父类)时只需要调用它对应的构造函数即可,对于新结构体来说原先的结构体是固定不变的,解耦了。所以这个方式的初始化不像那种把结构体成员挨个赋值这么繁琐,因为rtt规定了这些结构体以及封装了其初始化函数(在c++面向对象中叫构造函数),只需调用即可。