MST

星途 面试题库

面试题:Go自定义类型扩展中的继承模拟与多态实现

在Go语言中没有传统意义上的继承,尝试通过自定义类型扩展来模拟继承关系。比如定义一个基础类型 `Animal`,有方法 `Speak`。然后基于 `Animal` 扩展出 `Dog` 和 `Cat` 类型,分别重写 `Speak` 方法以实现多态。并且,设计一个函数 `MakeSound`,接受 `Animal` 类型接口参数并调用 `Speak` 方法,展示多态效果。请写出完整代码,并解释实现思路及可能存在的问题。
20.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

// Animal 基础类型
type Animal interface {
    Speak() string
}

// Dog 基于Animal扩展的类型
type Dog struct {
    Name string
}

// Speak 重写Animal的Speak方法
func (d Dog) Speak() string {
    return fmt.Sprintf("Woof! My name is %s", d.Name)
}

// Cat 基于Animal扩展的类型
type Cat struct {
    Name string
}

// Speak 重写Animal的Speak方法
func (c Cat) Speak() string {
    return fmt.Sprintf("Meow! My name is %s", c.Name)
}

// MakeSound 接受Animal接口参数并调用Speak方法
func MakeSound(a Animal) {
    fmt.Println(a.Speak())
}

实现思路

  1. 定义接口:首先定义 Animal 接口,包含 Speak 方法。这是模拟继承关系中的“基类方法”,任何实现了 Speak 方法的类型都被认为实现了 Animal 接口。
  2. 定义扩展类型:分别定义 DogCat 结构体类型,它们不直接继承自 Animal,但通过实现 Speak 方法,隐式地实现了 Animal 接口。这样就模拟了从 Animal 扩展出 DogCat 的关系。
  3. 多态实现MakeSound 函数接受 Animal 接口类型的参数。当传入 DogCat 类型的实例时,会根据实例的实际类型调用对应的 Speak 方法,从而实现多态效果。

可能存在的问题

  1. 代码重复:如果 Animal 有更多方法,DogCat 可能需要重复实现部分逻辑。虽然Go语言没有传统继承,但可以通过组合和接口嵌套等方式来减少重复代码。
  2. 缺乏继承层次结构:Go语言没有像传统面向对象语言那样明确的继承层次,这可能使代码结构在大型项目中较难理解和维护,特别是对于习惯传统继承的开发者。
  3. 接口兼容性:如果修改了 Animal 接口(比如添加新方法),所有实现了该接口的类型(如 DogCat)都必须实现新方法,否则编译会报错。