壹影博客.
我在下午4点钟开始想你
Golang语言基础篇实现面向对象编程
  • 2024-8-5日
  • 0评论
  • 402围观

Golang语言基础篇实现面向对象编程

利用Golang实现面向对象三大特性:封装、继承、多态

 本篇文章除了讨论Golang中实现面向对象的封装、继承、多态外还将讨论接口、方法重写等实现

一、封装(模版骨架)

封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作才能对字段进行操作。

注意:GO开发中并没有特别强调封装,这与Java不同,不能总是用Java的语法特性来看待GO,GO本身对面向对象的特性进行了简化。

1)将结构体、字段的首字母小写(private)
2)给结构体所在的包提供一个工厂模式的函数,首字母大写
3)提供一个首字母大写的Set方法,用于对属性判断与赋值
4)提供一个首字母大写的Get方法,用于获取属性的值

type pizza struct {
	name  string
	price int
}
 
func (p *pizza) SetName(name string) {
	p.name = name
}
 
func (p *pizza) GetName() string {
	return (*p).name
}
 
func (p *pizza) SetPrice(price int) {
	p.price = price
}
 
func (p *pizza) GetPrice() int {
	return (*p).price
}
 
func MakePizza(name string, price int) *pizza {
	return &pizza{
		name:  name,
		price: price,
	}
}


func main() {
	p := pizza.MakePizza("榴莲披萨", 40)
	fmt.Println("我花", p.GetPrice(), "吃到了", p.GetName())
}

二、继承(父子关系)

GO中继承的实现——嵌套匿名结构体,具体代码如下

// 人(父类)
type Person struct {
    name string //姓名
    sex  string //性别
    age  int    //年龄
}

// 学生类(子类)
type Student struct {
    Person     //匿名字段
    class  int //班级
    stuId  int //学号
}

func main() {
    //创建学生对象
    stu := Student{
        Person: Person{name: "小明", sex: "男", age: 18},
        class:  6,
        stuId:  201817340915,
    }
    fmt.Println(stu) // {{小明 男 18} 6 201817340915}
}

不同类指定不同方法

// 人(父类)
type Person struct {
	name string //姓名
	sex  string //性别
	age  int    //年龄
}

// 学生类(子类)
type Student struct {
	Person     //匿名字段
	class  int //班级
	stuId  int //学号
}

// 老师(子类)
type Teacher struct {
	Person         //匿名字段
	subject string //教学科目
	class   int    //班级
}

// 老师-->工作(上班)
func (teacher Teacher) working() {
	fmt.Println(teacher.name + " 正在上班")
}

// 学生-->学习
func (student Student) studying() {
	fmt.Println(student.name + " 正在学习")
}

func main() {
	//创建老师对象
	teacher := Teacher{
		Person:  Person{name: "陈老师", sex: "男", age: 26},
		subject: "体育",
		class:   8,
	}
	//创建学生对象
	student := Student{
		Person: Person{name: "张三", sex: "男", age: 18},
		class:  8,
		stuId:  2018075912,
	}
	teacher.working()  //老师工作  陈老师 正在上班
	student.studying() //学生学习 张三 正在学习

}

三、接口的使用

在go中接口(interface)与结构体一起使用


type Mouse struct {
	name string //鼠标名称
}
type Keyboard struct {
	name string //键盘名称
}

// 接口
type USB interface {
	input()  //输入方法
	output() //输出方法
}

func (mouse Mouse) input() {
	fmt.Println("鼠标输入...")
}

func (mouse Mouse) output() {
	fmt.Println("鼠标输出...")
}

func (keyboard Keyboard) input() {
	fmt.Println("键盘输入...")
}

func (keyboard Keyboard) output() {
	fmt.Println("键盘输出...")
}

func main() {
	//创建鼠标
	mouse := Mouse{
		name: "罗技",
	}
	mouse.input()
	mouse.output()
	keyboard := Keyboard{
		name: "某厂键盘",
	}
	keyboard.input()
	keyboard.output()
}

四、多态(一个事物多种状态)

譬如动物、猫、狗 :猫和狗是多态的,他们既可以是自己,也可以是动物,这个就是多态,一个事务有多种形念

如下代码为在go中多态的实现

// 动物接口
type Animal interface {
	eat()   //吃
	sleep() //睡
}

type Dog struct {
	name string //狗的名字
}

func (dog Dog) eat() {
	fmt.Println(dog.name + " 正在吃...")
}

func (dog Dog) sleep() {
	fmt.Println(dog.name + " 正在睡...")
}

// 多态方法
func doing(animal Animal) {
	animal.eat()
	animal.sleep()
}

func main() {

	//创建 狗
	dog := Dog{
		name: "小黄",
	}
	doing(dog) //狗属于动物 直接传入
}

五、方法重写

子类可以重写父类的方法
子类还可以新增自己的方法
子类可以访问呢父类中的属性和方法

// 人(父类)
type Person struct {
	name string //姓名
	sex  string //性别
	age  int    //年龄
}

// 老师(子类)
type Teacher struct {
	Person         //匿名字段
	subject string //教学科目
	class   int    //班级
}

// 老师-->工作(上班)
func (teacher Teacher) working() {
	fmt.Println(teacher.name + " 正在上班")
}

// 最顶层父类的方法
func (person Person) working() {
	fmt.Println(person.name + ": 工作使我快乐!")
}

func main() {
	//创建老师对象
	teacher := Teacher{
		Person:  Person{name: "陈老师", sex: "男", age: 26},
		subject: "体育",
		class:   8,
	}

	teacher.working() //老师工作
}

六、空接口(可存储任何类型)

不包含任何方法的接口

因此所有的结构体都默认实现了空接口,空接口可以存储任何的类型
interface{} == any 

//空接口
type Empty interface{}

func test(empty Empty) {

}
func main() {
	//可以传入任何类型 类似于Object
	test(1212)
}

//案例 定义一个什么都可以存储的Map
//可以传入任何类型 类似于Object
anyMap := make(map[string]interface{})
anyMap["name"] = 123
anyMap["key"]="nininini"
anyMap["tin"]=3.141596

希望本篇文章对您学习golang语言有所帮助
by 壹影

发表评论

渝ICP备19011465号 | 渝ICP备19011465号-1