CodeSys面向对象编程(OOP)——入门2

双儿看单片机2024-06-02 17:44:16  130

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
0
随机主题
万代南梦宫预测《艾尔登法环》DLC销量将会非常高英宣布7月大选, 民调显示保守党面临“溃败”美国女孩来中国旅游,刚上街就被吓哭,直言:中国不太安全美专家: 中国军事实力世界第二! 与俄罗斯谁常规武器更胜一筹?王猛: 从没见爱德华兹这么累过 根本突不动 第四节全是跳投终结售价20.08万起的沃尔沃EX30, 410公里的续航有多少人买账?陈幸同混双击败张本美和, 陈熠击败林依诺, 赵大成击败薛飞奥迪官宣“大动作”: 新款Q7海外实车曝光! 全新Q5、Q9曝光法国公开和美国对着干,马克龙真的醒悟了真正厉害的人 在这方面做得都很“绝”张晋50岁生日晒全家福, 俩女儿长成翻版蔡少芬, 儿子烫卷发像爸爸许庄街道明德花园社区开展防汛演练落地还不到10万, 这三款合资车值得买, 三大件稳定, 开20年不用修股价跌至1.7元, 连22年现金分红+股息率达4%, 国资买进前十股东揭秘抗战时期我党如何在老蒋眼皮底下不知不觉中壮大八路军实力。拜仁新帅只差官宣!38岁降级队教练登陆豪门,5大豪门拒绝穆里尼奥老六艺术 游戏嘛怎么开心怎么来,让我们忘记生活的压力吧。茅台的主营业务是什么? 你真的了解吗?谢晖死活不换人! 王禹李申圆跑拉胯了 贝里奇战犯级表现, 葛副总还是别上了非遗看中国|银装嫁衣周鸿祎做客京东直播间畅谈AI:中国大模型发展关键在抓住场景
最新回复(0)