Go语言中的OOP(面向对象)思想总结

封装

Go语言中并没有特定的方式去定义一个所谓的“类”,所以,Go语言中实现对象中封装的方式比较特殊,通过在函数名字前(func和函数名之间)放上一个变量,从而实现将这个函数与该变量进行绑定,使这个函数成为该变量的一个独占方法,进而实现了封装这个特性
为了更贴合“类”这个概念,我们一般使用一个结构体来作为这个变量,下面给出一个例子

package main

import "fmt"

type Student struct {
	ID   int
	Name string
}

func (stu Student) GetName() string {
	return stu.Name
}

func main() {
	stu := Student{ID: 1, Name: "Wei Yi"}
	fmt.Println(stu.GetName())
}

我们可以将Student看作是一个类,stu是该类的一个对象,这个类有两个成员变量ID和Name,GetName的该类的一个方法,用于访问对象中的Name变量
Go语言相对于其他面向对象语言的一个特点是没有乱七八糟的private,protect,public等等(逃

有一点需要特别关注,这个函数名之前的变量可以理解为是这个函数的一个参数,所以这里存在两种写法

//类比值传递和地址传递

func (stu Student) GetName() string {
	return stu.Name
}

func (stu *Student) GetName() string {
	return stu.Name
}

后者其实是将这个方法绑定在这个变量的指针上,当我们需要修改这个对象里面的一个成员的时候,必须要用到后者的写法,不然修改的成员变量只是一个内存中的一个副本,原对象并没有发生改变

//正确的写法
func (stu *Student) SetName(name string) {
	stu.Name = name
}

继承

Go语言中父类对子类的继承是通过结构体的嵌套实现的,把父类的类名放在子类的定义里,即可完成对父类的继承
不过多用语言解释,直接上代码

package main

import "fmt"

//父类
type Animal struct {
	name string
}

//子类
type Cat struct {
	Animal
}

//定义父类的方法
func (animal *Animal) Sleep() {
	fmt.Println(animal.name + "is sleeping.")
}

func (animal *Animal) Walk() {
	fmt.Println(animal.name + "is Walking.")
}

//定义子类的新方法
func (cat *Cat) Cry() {
	fmt.Println(cat.name + ": MiaoMiao(new method)")
}

//重写父类的方法
func (cat *Cat) Sleep() {
	fmt.Println("cat is sleeping(rewrite method).")
}

func main() {
	var animal Animal
	var cat Cat
	animal.name = "小动物"
	cat.name = "小猫"
	animal.Walk()
	cat.Walk() //继承父类的方法
	animal.Sleep()
	cat.Sleep() //重写过后的方法
	cat.Cry()
}

运行结果
在这里插入图片描述

多态

Go语言中使用接口interface类型来实现多态。Go语言中的多态和Java里面的不同点是,它去除了所谓的继承关系。如果一个类实现了一个接口里的全部方法,即可认为这个类实现了这个接口,而并不需要将接口类型嵌套在这个类的结构体里。所以从本质上讲,Go语言里的接口实际上是一种指针。

package main

import "fmt"

type Animal interface {
	Cry()
}

type Cat struct {
	name string
}

type Dog struct {
	name string
}

func (cat *Cat) Cry() {
	fmt.Println("MiaoMiao")
}

func (dog *Dog) Cry() {
	fmt.Println("WangWang")
}

func test(animal Animal) {
	animal.Cry()
}

func main() {
	var animal Animal
	var dog Dog
	var cat Cat
	animal = &dog
	animal.Cry()
	animal = &cat
	animal.Cry()
	test(&dog)
	test(&cat)
}

运行结果
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java OOP面向对象十二章书虫阅读器代码是一个用于管理和操作图书馆的应用程序。以下是该应用程序的主要功能和代码示例: 1. 图书类(Book): - 属性:书名(title)、作者(author)、出版社(publisher)、ISBN号(isbn) - 方法:获取书名、获取作者、获取出版社、获取ISBN号 ```java public class Book { private String title; private String author; private String publisher; private String isbn; public Book(String title, String author, String publisher, String isbn) { this.title = title; this.author = author; this.publisher = publisher; this.isbn = isbn; } public String getTitle() { return title; } public String getAuthor() { return author; } public String getPublisher() { return publisher; } public String getIsbn() { return isbn; } } ``` 2. 图书馆类(Library): - 属性:图书列表(books) - 方法:添加图书、删除图书、查找图书、显示所有图书 ```java import java.util.ArrayList; import java.util.List; public class Library { private List<Book> books; public Library() { books = new ArrayList<>(); } public void addBook(Book book) { books.add(book); } public void removeBook(Book book) { books.remove(book); } public Book findBook(String title) { for (Book book : books) { if (book.getTitle().equals(title)) { return book; } } return null; } public void displayBooks() { for (Book book : books) { System.out.println("Title: " + book.getTitle()); System.out.println("Author: " + book.getAuthor()); System.out.println("Publisher: " + book.getPublisher()); System.out.println("ISBN: " + book.getIsbn()); System.out.println("----------"); } } } ``` 以上是一个简单的图书馆管理系统的代码示例,包括了图书类和图书馆类。你可以根据需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值