请问一个关于脚本继承的问题 调用父类方法却执行的子类的?

两个脚本A,B B继承A
A,B里都有一个init()方法
B添加近节点
scriptA = getComponent(‘A’);
scriptA.init()//这里调用的却是B的init,
本意应该是调用A的init 因为取得的是A的脚本引用 请问哪里有错误?
或者应该怎么理解这个过程

实际上只有B这个组件,getComponent(A)实际上取到的就是B实例化的对象

这不就是多态的标准实现么

1.按住你的描述A是个父类且是个普通类没有挂载到节点上,B继承这个父类挂载到了节点上
2.一个类要访问其成员方法必须实例化这个类,然后用引用变量存储(指向)这个类实例的内存地址,所以你才能用这个引用变量去调用成员方法,成员方法修饰public(本类子类和实例能访问调用),private(只有本类内部能访问调用)等。
3.在Cocos中,你可以理解为Cocos是个主线程。场景上的节点实际是存储的是配置信息,如果你在一个节点上挂载脚本且继承了引擎类,那么这个脚本就会被主线程执行的某些反射等方法找到你这个脚本写的自定义写的所有信息,然后编辑器会自动帮你实例化new这个脚本,且会调用GUI等方法把public公共的成员变量放在场景面板上供外部修改,并把包含生命周期函数的start等方法按照特定顺序放入主线程执行。
4.回到你执行子类init的问题,A并未挂载到场景节点上,B类继承A类,B类挂载到了节点上, 所以运行后,B类被引擎自动实例化,假设你的scriptA = getComponent(‘A’);scriptA.init()是写在B类脚本的Start方法里,实例化后的B类可以访问修改A父类的pubilc和protected成员方法和属性。
5.由于B也有init方法,根据继承规则,B类init方法会覆盖A父类的Init方法,在我理解上,getComponent(‘A’)这个写法本身是错误的,因为A脚本并为挂载到节点上,并未被引擎自动实例化,能够编译通过的原因可能是这个方法内部引擎再继续寻找这个类的子类所以你才能编译通过,你阴差阳错的获取到了A类的唯一子类B类,然后你用这个指向B类实例的变量scriptA 去调用init方法,由于B类继承A类,所以直接调用的是子类也就是B类的init方法,要想调用A父类的init方法,要改成super.init()。
6.要想直接获取到A类的init方法调用,你可以把A类也挂载到场景上,然后用一个A类脚本类型的属性存储A类实例引用:public A a ;onLoad方法里a = this; 因为场景已经帮你实例化A类了,所以你不需要new A类。然后B类调用这个实例a.init(),这样就是执行A脚本的init()方法了;

第5点我也不明白 求大佬继续指点。

子类复写父类方法是 , 调用一下 super 函数

super.init() 即可 不需要getComponent.

get拿的是实例,就是B,要调A必须用super

实际上你只有脚本b 想要调用a的init可以用super.init()