5.4.1:我们想在原有的功能块上增加功能,又希望保留原有的功能,关键字EXTENDS来完成功能。是codesys面向对象编程思想中实现代码复用和扩展主要途径。具体操作如下图
注意:子类会继承父类中所有的变量,方法和属性。子类及子类对象视访问修饰符进行选择性访问。由protected访问修饰符修饰的变量或者方法,只能在子类中被访问 ,而不能在子类对象中被访问。如下图
父类中的方法体
子类的方法体中可以访问到由protected修饰的METH_Bark方法
子类对象中不能访问到由protected修饰的METH_Bark方法
5.4.2:作为扩展可以新增方法,也可对继承的方法和属性进行重写。
方法的新增
1,方法的新增好理解,比如上例中,FB_Cat继承自FB_Animal。FB_Cat比FB_Animal多了METH_catchMice方法。在原来的基础上新增了功能,相当于扩展。
2,什么是重写?为什么需要重写?什么时候用重写?
2-1:什么是重写:父类和子类中存在同名的方法和属性,并且在子类中对其进行了重写(不同的方法体)。如下图
FB_Cat继承自FB_Animal。FB_Cat和FB_Animal都有METH_move方法和属性Age。
属性重写
方法的重写
2-2:为什么需要重写?以及什么时候需要用到重写?重写是实现多态的一种方式,比如鸡和猫,都继承自动物类,有一个走路的方法。当动物类为鸡的时候我们重写方法为:“两只脚走路”。当动物类为猫的时候我们重写方法为:“四只脚走路”。
5.5:this和super关键字:
5.5.1:this是一种指针,引用当前功能块的方法,变量和属性。
5.5.2:super也是一种指针,引用父类功能块的方法,变量和属性。
在上节中,父类和子类有一个同名方法(METH_move),我们可以通过this和super关键字来区分,调用的是父类的METH_move方法还是子类的METH_move方法。变量和属性同样的道理。
5.6:INTERFACE接口和IMPLEMENTS
5.6.1:什么叫接口?接口提供了一种契约(或者说是规范),让使用接口的设计人员必须严格的遵守接口提出的约定。举个例子:在组装电脑时,主机与机箱之间就存在一种事先约定,不管什么型号或品牌的机箱,什么类型或品牌的主板都必须遵照一定的标准来设计制造,所以组装机时,电脑的零配件都可以安装在现今大多数的机箱上。接口就可以看做是这种标准,它强制要求派生类必须实现接口约定的规范,以保证派生类必须拥有某些特性。
5.6.2:接口的特性:
1,继承接口的任何非抽象类都必须实现接口的所有成员。
2,接口不能直接实例化。
3,接口可以包含属性和方法。
4,接口不包含方法的实现。更像是一种功能的约束。
5,接口支持多继承。
5.6.3:接口实现多态与继承实现多态的区别:
继承实现多态和接口实现多态都是面向对象编程中常见的多态实现方式,它们各有优缺点:
继承实现多态的优点:
代码复用:通过继承,可以共享基类的属性和方法,减少代码冗余。
易于理解:继承关系在代码中清晰可见,容易理解和维护。
继承实现多态的缺点:
耦合性较高:子类与基类之间存在紧密的耦合关系,修改基类可能会影响到所有子类。
灵活性受限:子类必须继承自基类,无法灵活地选择要实现的方法。
接口实现多态的优点:
降低耦合:接口定义了一组抽象方法,实现接口的类只需实现这些方法,降低了类之间的耦合性。
灵活性高:类可以实现多个接口,根据具体需求选择实现的接口方法,提高了代码的灵活性。
可扩展性好:新的类可以很容易地实现接口,加入到多态体系中,更利于系统的扩展。
在实际编程中,可能需要用到多继承以达到更好的设计效果。例如我们有一个“飞马”类,它既有鸟具有的飞的功能,也有马的奔跑的功能。这时候我们会用到两个基类“鸟类”和“马类”,在实际的实现中显得代码非常的乱,例如:“飞马”这个类到底是“鸟”类呢还是“马”类呢?这样继承所带来的危害远比它带来的好处多。为了解决这个问题提出了接口。所以在很大程度上我们把面向对象编程也叫做面向接口编程。
5.6.4:codesys中接口的实现:
codesys中通过关键字IMPLEMENTS实现接口。具体用法如下:
5.6 abstract:关键字抽象:
当父类中函数不知道该如何实现的时候(比如父类“图形”中有一个“绘图”的方法,“绘图”本身就比较抽象,没有办法写方法体。),可以考虑用抽象类实现多态。用关键字“abstract”标记。
抽象类特性有:
1,抽象成员必须在抽象类中,并且抽象方法是不能有方法体的。
2,抽象成员(包括抽象方法和抽象属性)必须在子类中被实现,除非子类也是抽象类。
3,抽象类不能被实例化。
4,抽象类中可以包含非抽象成员。并且子类不需要重写非抽象成员(适用于所有子类都有相同的属性或者功能的情况,比如继承于图形类子类,不管是三角形还是正方形,线条的颜色都一致的情况)。
抽象类中的成员
父类中抽象成员没有实现编译报错
父类中抽象成员实现后编译报错消除
5.7 关于实现多态方式的总结:
前面我们已经接触过实现多态的方式有三种:重写、抽象类以及接口。在此之前我也是一脸的懵逼啊,敢接挺乱的,什么时候通过重写来实现多态,什么时候用抽象类实现多态,什么时候又通过接口类实现多态呢?下面来总结一下:
1,如果必须在父类中提供一个方法,而且这个方法有方法体,子类根据需要重写该方法(不用必须重写),则用继承重写的方式实现多态。
2,如果父类中提供的方法,不知道该如何实现(无方法体),子类又必须重写该方法的时候用抽象类实现多态。
3,当差异较大的对象间寻求功能上的共性时(个性大于共性,差异较大的个性间具有某些相同的行为,且相同的行为的实现方式差异较大)则考虑使用接口。接口更强调的是继承对象间具有相同的行为。
4,当在共性较多的对象间寻求功能上的差异时,使用抽象类。抽象类强调的是继承对象间具有相同的属性。
最后,PLC编程毕竟不是纯粹的软件,没有这么复杂。考虑这么多反而增加了学习的难度,典型的没事瞎显摆?所以,什么重写,抽象类,还是啥玩意,都TM直接用接口,准没错。
转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/639810.html