3.1引擎bug,不支持继承语法。同样的脚本2.4.5运行正常,3.1却不正常!官方可以看一下吗!!!

测试项目代码:
3.1版本:TestShader.zip (1.2 MB)

2.4.5版本:Test245.zip (820.3 KB)

父类代码初始化两个属性:

子类代码继承父类增加两个属性:

创建子类对象,然后打印

打印结果,没有子类的属性的值

3.1版本打印结果


2.4.5版本打印结果

同样的代码在2.4。5上跑是没有问题的,请大佬帮忙看一下。

好像子类的init方法没有被调用

在父类构造函数中有调用的

你在子类的init的打印 是输出了吗? 如果那里执行了 理论上来说就不会为空呢

子类是有值的

你 new的是子对象,里面写了super,然后逻辑就会走父类构造函数,父类进入后执行init给parentAB赋值。问题就在这了,子类是重写了init。父类是不会去执行子类的init的。你应该在子类的构造函数中加入子类的init调用,而子类init里不用写super

这样写按照js的原型语法是没有问题,同样的代码在2.4.5运行时正常。

那既然3.1不正常,你改变下逻辑不行吗?一定要一条路走到黑?或者是说你只是想讨论这个问题。而不是想解决这个问题。

我是在做项目升级,要是改会影响很多地方。不知道这个问题刻意这样做还是引擎bug。

我问一下相关同事~

应该是两边TS编译有所不同。2.x 相当于 useDefineForClassFields: false,3.x 默认开启 自己可以关。
image

有两个修改方式:

  1. 将子类属性改为declare
    image

  2. 关掉脚本里的一个配置

建议使用1~

方案1,可以解决问题,但是这个declare用一般用在声明文件里,在感觉怪怪的.
方案2:解决不了问题。
我发现问题的原因是cocos编译后js,会强制把为为设值变量设置为undefine(截图).而webpack和Rollup都会忽略这个变量,包括cocos2.X也是这样做。3.1不知这样做是否合理?

webpack、rollup 都不是编译工具,babel 和 TypeScript 才是。编译的差异楼上同事已经说过了。这个选项如果不管用,你重启一下编辑器试试。

declare 是 TypeScript 的标准语法,没有只在 .d.ts 里面用这个说法,见: TypeScript: Documentation - TypeScript 3.7 (typescriptlang.org)

我先用方案1。
方案2,取消编译class字段选项,重启后还是有问题,字段还是被赋空值,编译结果如下:

还有个不支持“import =” 问题,大佬帮忙看看

试试 初始化不在 父类里调用呢?
在子类里调用 init
总感觉你这种写法可能有些怪,(在构造函数里去实现多态,调用子类的init),不过父类和子类都输出了,但实际上 子类 却没有值,怀疑是父类里的init 创建了另一个子类对象。。(只是怀疑,没有深入探究)
这样改一下也 也可以实现,就是在子类里去初始化

在c++里,在父类里调用init是不会调用子类的

。。。。。

C++ 中构造函数调用虚函数是未定义行为吧,应该会有个大大的警告。

确实 可能 会有问题,不建议在C++ 中构造函数调用虚函数,

不过我想说的重点是,楼主 的这个写法 似乎有点问题。。。

关于useDefineForClassFields的问题,我另开一贴,求助于官方。

帖子连接点我