Open 981377660LMT opened 6 months ago
答案:
问题记录:
解题萌新(981377660) 2023-12-17 15:49:27 需要覆盖重写父类在构造函数中调用的一个函数 但是子类的这个函数里想访问子类的属性,访问不到
解题十分钟(402740419) 2023-12-17 15:57:33 那肯定啊 啥语言也不能这么玩啊
解题萌新(981377660) 2023-12-17 16:03:02
@解题十分钟 python 可以
js里访问派生类的构造函数中的 this 前,必须调用 super,不能这样写
现在改不动了
解题十分钟(402740419) 2023-12-17 16:10:10 @解题萌新 什么、居然可以super.init之前搞属性,这是异端 我认为这是更危险的语言设计,这非常容易导致在super.init之前调用到super的其他方法 除了python以外,只见过某些没有原生class的语言(譬如lua)是这么设计的
解题萌新(981377660) 2023-12-17 16:12:13
那这种情况应该怎么重构代码
我现在在重写SortedListWithSum
解题十分钟(402740419) 2023-12-17 16:14:13 你可以写一个virtual init() 在这里面初始化属性,替代构造函数。 但这也只是绕一下,工程上不建议这么写 工程上宁愿手动build,不要在构造函数里直接build,问题就不存在了( 或者在factory里面去build
题萌新(981377660) 2023-12-17 16:16:10 @解题十分钟 有道理 不要在构造函数里直接build
解题十分钟(402740419) 2023-12-17 16:17:18 嗯,很多框架(包括C++的、TS的)都会特地搞出一个生命周期叫 OnInit /OnLoad 其实细究起来 和构造函数 语义上没啥区别 但可以更好的回避类似的问题
解题萌新(981377660) 2023-12-17 16:22:39
好了,这是我现在的做法
子类的_init直接为空,子类的_build就走子类的逻辑
https://stackoverflow.com/questions/30819663/call-an-overridden-method-in-base-class-constructor-in-typescript