测试项目代码:
3.1版本:TestShader.zip (1.2 MB)
2.4.5版本:Test245.zip (820.3 KB)
父类代码初始化两个属性:
子类代码继承父类增加两个属性:
创建子类对象,然后打印
打印结果,没有子类的属性的值
3.1版本打印结果
2.4.5版本打印结果
同样的代码在2.4。5上跑是没有问题的,请大佬帮忙看一下。
测试项目代码:
3.1版本:TestShader.zip (1.2 MB)
2.4.5版本:Test245.zip (820.3 KB)
父类代码初始化两个属性:
子类代码继承父类增加两个属性:
创建子类对象,然后打印
打印结果,没有子类的属性的值
3.1版本打印结果
同样的代码在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 默认开启 自己可以关。
有两个修改方式:
将子类属性改为declare
关掉脚本里的一个配置
建议使用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)
试试 初始化不在 父类里调用呢?
在子类里调用 init
总感觉你这种写法可能有些怪,(在构造函数里去实现多态,调用子类的init),不过父类和子类都输出了,但实际上 子类 却没有值,怀疑是父类里的init 创建了另一个子类对象。。(只是怀疑,没有深入探究)
这样改一下也 也可以实现,就是在子类里去初始化
C++ 中构造函数调用虚函数是未定义行为吧,应该会有个大大的警告。
确实 可能 会有问题,不建议在C++ 中构造函数调用虚函数,
不过我想说的重点是,楼主 的这个写法 似乎有点问题。。。