在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本节书摘来自华章出版社《Effective Ruby:改善Ruby程序的48条建议》一书中的第2章,第2.3节,作者 [美]彼得 J.琼斯(Peter J. Jones),更多章节内容可以访问云栖社区“华章计算机”公众号查看 第8条:初始化子类时调用superRuby中,类没有传统的OOP式的构造方法。如果想要控制对象的初始状态,我们得写一个名为initialize的方法并在那里做必要的工作。在一个新对象被分配空间之后,就会在new中调用这个方法。如果你不在自己的类中自定义initialize方法,你的类将从BasicObject类中继承默认实现。不过这并不那么有效。事实上,那是个空方法,什么也没做。它只是在那里,使得new方法在你没有自定义initialize方法时有处可调。还好,很多时候BasicObject#initialize就可以满足你的需要了。不过当你需要自定义initialize方法时是个小例外。 来看方法Parent#initialize,很容易看出,当创建一个新的Parent对象时,实例变量@name会被初始化为一个默认值。也很容易看出当创建一个Child时,方法Child#initialize会为实例变量@grade赋值。可能不清楚的问题就是,创建一个Child对象是否也能为@name赋初始值。在IRB中运行这些代码就可以搞清楚这个问 啊!Ruby不能自动调用被重载的方法,即使在initialize方法中也不行。本例中Child::new没有调用Parent类里的initialize方法,因为Child类有自己的initialize方法,它重载了父类的这个方法。重写带参的initialize方法将使事情更清楚些。 如今你能看到这个窘境了。Ruby没有为我们提供给子类和其超类的initialize方法建立联系的方式。因此没办法知道如何自动调用超类中的initialize方法并传递正确的参数。于是这个任务留给了我们。这对新手Ruby程序员来说是件令人惊讶的事情,甚至老手也会不一定记得。 在放弃了自动构造方法的同时我们获得了灵活性。使用super调用超类的initialize方法让我们拥有了如何初始化超类以及在什么时候初始化超类的控制权。超类应该在子类之前初始化吗?在初始化超类之前我们需要设置一些环境变量吗?我们可以自由地按照需要安排这些行为。只要记住用super就行,花点时间复习一下super的各种用法吧,见第7条。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论