【Go语言】面向对象编程(二):通过组合实现类的继承和方法重写

通过组合实现类的继承和方法重写

要实现面向对象的编程,就必须实现面向对象编程的三大特性:封装、继承和多态。

1 封装

类的定义及其内部数据的定义可以看作是类的属性,基于类定义的函数方法则是类的成员方法。

2 继承

Go 语言中,没有直接提供继承相关的语法实现,可以通过 组合 的方式间接实现类似的功能,所谓组合,就是将一个类型嵌入到另一个类型,从而构建新的类型结构。

具体实现如下所示:

  1. 定义一个基础的类 Animal,其中定义了 Name 属性以及 CallFavorFoodGetName 成员方法。

    type Animal struct {
    	Name string
    }
    
    func (a Animal) Call() string {
    	return "动物的叫声..."
    }
    func (a Animal) FavorFood() string {
    	return "爱吃的食物..."
    }
    func (a Animal) GetName() string {
    	return a.Name
    }
    
  2. 定义一个新的类 Dog,继承 Animal 类的属性和成员方法。

    type Dog struct {
    	Animal
    }
    
  3. main 方法中对 AnimalDog 进行调用测试。

    animal := GoClass.Animal{"中华田园犬"}
    dog := GoClass.Dog{animal}
    fmt.Println(dog.GetName())
    fmt.Println(dog.Call())
    fmt.Println(dog.FavorFood())
    

    在这里插入图片描述

3 多态

这里重写方法 FavorFoodCall,如下所示:

func (d Dog) FavorFood() string {
    return "骨头"
}
func (d Dog) Call() string {
    return "汪汪汪"
}

main 方法中进行调用,如下所示:

fmt.Print(dog.Animal.Call())
fmt.Println(dog.Call())
fmt.Print(dog.Animal.FavorFood())
fmt.Println(dog.FavorFood())

在这里插入图片描述

4 其他问题
4.1 多继承同名方法冲突处理

需要注意组合的不同类型之间包含同名方法,比如 AnimalPet 都包含了 GetName 方法,如果子类 Dog 没有重写该方法,直接在 Dog 实例上调用的话会报错:

func main() {
    animal := Animal{"中华田园犬"}
    pet := Pet{"宠物狗"}
    dog := Dog{animal, pet}
    fmt.Println(dog.GetName())
}

在这里插入图片描述

需要显式的指定调用那个父类的方法,修改如下则不报错:

func main() {
    animal := Animal{"中华田园犬"}
    pet := Pet{"宠物狗"}
    dog := Dog{animal, pet}
    fmt.Println(dog.GetName())
}

在这里插入图片描述

4.2 为组合类型设置别名

能够设置继承父类的名称,示例如下:

type Dog struct {
    Animal *GoClass.Animal
    Pet    *GoClass.Pet
}

animal := GoClass.Animal{"中华田园犬"}
pet := GoClass.Pet{"宠物狗"}
dog := Dog{&animal, &pet}
fmt.Println(dog.Pet.GetName())
fmt.Println(dog.Animal.GetName())

在这里插入图片描述

相关推荐

  1. Go语言面向对象编程(OOP)

    2024-06-11 19:04:04       20 阅读
  2. Python编程面向对象()—多态

    2024-06-11 19:04:04       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 19:04:04       8 阅读
  2. 【Python教程】压缩PDF文件大小

    2024-06-11 19:04:04       9 阅读
  3. 通过文章id递归查询所有评论(xml)

    2024-06-11 19:04:04       10 阅读

热门阅读

  1. c语言之 **指针

    2024-06-11 19:04:04       6 阅读
  2. 008.googleNet-FashionMNIST-正确率90.510

    2024-06-11 19:04:04       8 阅读
  3. Android13 Settings 左上角箭头图标点击无效

    2024-06-11 19:04:04       5 阅读
  4. 【摘葡萄game】

    2024-06-11 19:04:04       6 阅读
  5. C++ Primer Chapter 8 The IO Library

    2024-06-11 19:04:04       5 阅读
  6. 深度学习的可微渲染

    2024-06-11 19:04:04       6 阅读
  7. Linux学习问题

    2024-06-11 19:04:04       6 阅读
  8. NAT

    NAT

    2024-06-11 19:04:04      6 阅读
  9. 享元模式

    2024-06-11 19:04:04       5 阅读
  10. css特效:对多个tag标签实现模拟地球仪特效

    2024-06-11 19:04:04       5 阅读
  11. 2024-6-11-SPECT和PET的区别是什么

    2024-06-11 19:04:04       5 阅读
  12. docker-ce 和 docker-ee介绍版本介绍

    2024-06-11 19:04:04       4 阅读