纯继承与扩展

在学习继承时,采取某种“纯粹”的方式来创建继承层次结构似乎是最清楚易懂的方法了。也

就是说,只有在基类或接口中已经建立的方法才可以在导出类中被重载.

之所以被称作是纯粹的“is-a”(是一种)关系,是因为一个类的接口已经确定了它应该是什

么。继承可以确保所有的导出类具有基类的所有接口,且绝对不会少。按上图那么做,导

出类只是具有和基类一样的接口。

 

也可以认为这是一种纯替代,因为导出类可以完全地代替基类,那在我们使用时,就永远

不需要知道关于子类的任何额外信息了。

也就是说,基类可以接受我们发送给导出类的任何消息,因为二者有着完全相同的接口。

我们只需从导出类向上转型,永远不需知道正在处理的对象的确切类型。所有这一切,都

是通过多态进行处理的。

 

按这种方式考虑,似乎只有纯粹的 is-a 关系才是唯一明智的做法。 所有其他的设计都只会

导致混乱,当然也就错误百出。这仍是一个陷阱,因为一旦我们深入研究,就会改变主意,

并发现扩展接口(遗憾的是,extends 关键字似乎在怂恿我们这样做)才是解决特定问题

的完美方案。可将其定义为“is-like-a”(像一个)关系,因为导出类就像是一个基类——

它有着相同的基本接口——但是它还具有由额外方法实现的其他特性。

虽然这是一种有用且明智的方法(视情况而定),但是它也有缺点。导出类中扩展的接口

不能被基类访问,因此,一旦我们向上转型,就不能调用那些新增方法:

在这种情况下,如果我们不进行向上转型,这样的问题也就不会出现。但是通常情况下,

我们需要重新查明对象的确切类型,以便能够访问该类型所扩充的方法。随后的一节将展

示该具体怎么做。

 


Vue 3 中,虽然不像传统的 class-based 组件那样有明确的“继承”机制,但是你可以通过组合、复用扩展现有的功能来实现类似的功能。函数式组件更倾向于将组件视为函数,接受 props slots 进行渲染。以下是一些实现方式: 1. **组合(Composition API)**: 使用 `setup` 函数可以组合多个独立的部分,比如状态管理(Vuex)、计算属性、生命周期钩子等。如果需要复用一些逻辑,可以在 setup 中定义一个单独的函数,并在需要的地方引用它。 ```js // 父组件 import ChildComponent from './Child.vue' export default { setup(props) { // 共享逻辑 const sharedLogic = () => {...} return { childProps: props, sharedLogic } }, } // 子组件 <template> <ChildComponent :props="childProps" /> </template> <script> export default { setup(props, context) { // 可能扩展父组件的逻辑 const extendedLogic = reactive({ ...sharedLogic(), ...customLogic }) return { logic: extendedLogic } }, } </script> ``` 2. **混合(Mixins)**: 虽然 Vue 3 没有官方的 Mixins,但可以通过自定义选项(options API)或者第三方库(如 Vue Compose 或 Vue Mixins)来实现某种形式的继承。不过,这种方式不是推荐的最佳实践,因为它们可能导致代码结构复杂,维护困难。 3. **API 的扩展**: 如果你想扩展 Vue 本身的 API,可以通过插件或者自定义指令来实现。但这通常用于提供新的全局特性,而不是直接对已有组件进行扩展。 记住,函数式组件的设计理念是轻量级简洁,避免过度设计。在实际使用中,合理地利用组合复用是关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值