|
|
@ -297,7 +297,7 @@ help: function arguments must have a statically known size, borrowed types alway
|
|
|
|
|
|
|
|
|
|
|
|
简而言之,当类型 `Button` 实现了特征 `Draw` 时,类型 `Button` 的实例对象 `btn` 可以当作特征 `Draw` 的特征对象类型来使用,`btn` 中保存了作为特征对象的数据指针(指向类型 `Button` 的实例数据)和行为指针(指向 `vtable`)。
|
|
|
|
简而言之,当类型 `Button` 实现了特征 `Draw` 时,类型 `Button` 的实例对象 `btn` 可以当作特征 `Draw` 的特征对象类型来使用,`btn` 中保存了作为特征对象的数据指针(指向类型 `Button` 的实例数据)和行为指针(指向 `vtable`)。
|
|
|
|
|
|
|
|
|
|
|
|
一定要注意,此时的 `btn` 被当作特征 `Draw` 的特征对象的实例数据,而不再是类型 `Button` 的实例对象,而且 `btn` 的 `vtable` 只包含了实现自特征 `Draw` 的那些方法(比如 `draw`),因此 `btn` 只能调用实现于特征 `Draw` 的 `draw` 方法,而不能调用类型 `Button` 本身实现的方法和类型 `Button` 实现于其他特征的方法。**也就是说,`btn` 当作哪个特征对象来用,它的 `vtable` 中就包含哪个特征的方法。**
|
|
|
|
一定要注意,此时的 `btn` 是 `Draw` 的特征对象的实例,而不再是具体类型 `Button` 的实例,而且 `btn` 的 `vtable` 只包含了实现自特征 `Draw` 的那些方法(比如 `draw`),因此 `btn` 只能调用实现于特征 `Draw` 的 `draw` 方法,而不能调用类型 `Button` 本身实现的方法和类型 `Button` 实现于其他特征的方法。**也就是说,`btn` 是哪个特征对象的实例,它的 `vtable` 中就包含了该特征的方法。**
|
|
|
|
|
|
|
|
|
|
|
|
## Self 与 self
|
|
|
|
## Self 与 self
|
|
|
|
|
|
|
|
|
|
|
|