这是OOP编程第5次探讨。前面几次探讨了类的变量、代码和对象。这次讨论继承和扩展。探讨这些内容是有先后顺序考虑的。我们的目标是接口。因为接口在OOP中用的最多,也最难理解。先探讨容易的,再探讨难一些,再就是横向纵向混合的,最后是迈向接口。跟随我的脚步,我们一起循序渐进走近接口,理解接口。接口之前的一切都是为接口做准备。
一,扩展的基本概念
我们在探秘3中已经接触了继承。继承到底是什么,我们都已经知道个大概。这里再次借用探秘3中例子说明。(本文档中所有例子的环境是CODESYS V3.5 SP20)
,图 1
这里有个类FB1,这个FB1有些变量。我们再声明一个类FB1_E,作为FB1的扩展类。如下图
, 图 2
观察图2,发现凡是父类有的变量子类都有,这称为继承。子类不仅继承变量,还继承属性、动作、方法、接口。这就是父类和子类的关系。子类完全拥有父类的内容(变量和代码),同时子类还可以扩展。这里讲子类完全拥有父类的内容这句话是概念性的思想性的。其实这句话并不准确。比如父类的内容如果用Final声明,那么这就不能继承。还有一些父类的东西不能继承,在本文档下文中探讨。
我们需要注意图2红色方框。这个词的中文意思是扩展。我觉得这个字用的很准确。FB1_E是对FB1的扩展。我们中国人在最开始接触OOP时,把扩展类翻译为子类,把基类翻译为父类。这种翻译容易误导人。如果把扩展的双方称为父类和子类,那么好像这2个类有一种继承关系,有一种从属关系,有上下关系。其实都没有。只有扩展这个词最准确。本文的标题中使用了继承的字眼,也是容易误导人的。但是大家都约定俗成了,所以也就这么继续使用这些字眼。这一段是本文档我要阐述内容最重要的一段文字之一。也是我为什么把继承单列为一个文档的原因。
我们继续探讨扩展
, 图 3
图3中,子类可以定义自己的变量。也就是把父类扩展后形成了子类。不仅变量可以扩展。属性、动作、方法、都可以扩展。
前面我们讨论了基类和扩展类的行为。但是总体讲还是比较抽象,图4是基类和扩展类的图形化,帮助我们理解扩展这个概念。
,图4
到这里,不知道读者朋友们有没有疑问?既然子类扩展了父类,那我们完全可以创建一个类,该类直接拷贝创建好的类的变量和代码,并且再增加自己的变量和代码,形成一个新的类。这样不也相当于扩展了吗?为什么在OOP中还创造一个继承关系?把OOP编程搞的好像很复杂的样子!难道就是为了烧脑用的吗?当然不是。这样做有一个明显的好处。比如我们已经创建了父类和子类。程序运行了一段时间,也很完美。但是可能有新的需求,需要父类和子类都要增加一个共同的属性。那么对于OOP就很简单,我们只要在父类中增加这个属性,子类代码不用任何更改,自然就有了这个属性。所以,继承的最大好处是可以减少代码的重复量。
二,继承静态变量
扩展探讨到这里,我们已经有些水平了,那我们可以思考一个问题。如果父类有静态变量a,那么父类对象中的a和子类的对象中的a是一个变量吗?
子类对父类静态变量的继承会是怎样的情景呢?运行图5中的程序,i2的值应该是多少呢?
,图5
我们用图4进行形象思考。得到的答案是i2的结果应该是888。
三,PLC中继承的一个特殊点
PLC中继承还有1个注意点:子类不能继承父类中FB中的代码以及附随的临时变量。这点完全是PLC特有的,在其他高级OOP语言中,没有这样的情况。在探秘4中,我们探讨过这个4不像。在其他高级OOP语言中类本身是没有代码的,也没有临时变量的。类的所有代码都在方法中。
,图 6
如图6,在子类中访问父类的临时变量,编译系统报错。
通过前文的说明,现在我们可以理解子类不继承父类中FB的代码,但为什么也不能继承父类的临时变量呢。在探秘3中,我们就知道临时变量是函数的伴生物,没有函数自然就没有临时变量。FB中的代码可以理解为一个函数。如果函数不能继承,那么自然临时变量也不能继承。
不过,如果你特别想访问父类的temp变量,也不是没有办法。我们知道动作是可以访问类的temp变量,并且动作也可以继承。那么子类可以通过父类的动作访问父类的temp变量。这是可以实现的,在这里我就不举例了。至于原理是什么呢?这涉及到编译器。对于编译器来讲,这非常简单。只要运行动作,那么就在栈中按照FB声明的temp变量创建变量即可。这个在栈中新创建的变量在动作中,在FB中都可以访问,并且是一个地址,那么这就实现了在子类中访问父类的temp变量。不过当动作执行完毕时,这个临时变量会注销。虽然电脑的编译系统可以实现,但是我们在实际工作中,千万不要这么用。否则会把自己绕死,毕竟我们的脑在逻辑性上比电脑还差一块。
通过上一段的讨论,我想提醒一点,如果我们在PLC中用OOP思想编程,那么FB中就不要写任何代码也不要声明任何临时变量。这样不会引起混乱。还有一点我想到的,上面的讨论体现了OOP中经常困扰我们的问题:很多概念掺杂在一起,OOP就变得十分复杂。我们PLC的编程主要控制的还是物理设备,在本系列的总论中就讲到,PLC编程最重要的特性是稳定性、可靠性和可预期性。IT人员进入OT领域很容易忽视这一点。OT人员用OOP编程也要重视这个问题。
本节内容就这么多,在本节中,我们知道继承和扩展的一些基本特点,下节说说继承的重写。
3388

被折叠的 条评论
为什么被折叠?



