面向对象编程

  • 一、面向对象编程三大特性-封装
  • 二、面向对象编程三大特性-继承
  • 三、 接口
  • 四、面向对象编程三大特性-多态
  • 五、 类型断言
  • 总结


一、面向对象编程三大特性-封装

1)介绍

2)快速入门案例

package model
type person struct{
	Name string 
	age int
	salary float64
}
//相当于构造函数
func NewStudent(name string)*person{
	return &person{
		Name:name,
	}
func (p *person)SetAge(age int){
	if age>0&&age<150{
		p.age=age
	}else{
		fmt.Println("年龄范围不对!!!")
	}
func (p *person)GetAge()int{
	return p.age
}
func (p *person)SetSal(sal float64){
	if sal>=3000&&sal<=30000{
		p.sal =sal
	}else{
		fmt.Println("薪水范围不对!!!")
	}
func (p *person)GetSal()float64{
	return p.salary
}
}
}
package main
import(
	"fmt"
	"go_code/project00/model"
)
func main(){
	var stu=model.NewStudent("tom",88.8)
	fmt.Println(*stu)
	fmt.Println("name=",stu.Name,"score=",stu.GetScore())
}

package model02
import(
	"fmt"
)
type account struct{
	accountNo string
	pwd string 
	balance float64
}
func NewAccount(No string,pwd string,balance float64)*account{
	if len(accountNo)<6||len(accountNo)>10{
		fmt.Println("账号的长度不对...")
		return nil
	}
	if len(pwd)!=6{
		fmt.Println("密码的长度不对...")
	}
	if balance<20{
		fmt.Println("余额数目不对...")
	}
	return &account{
		accountNo:No,
		pwd:pwd,
		balance:balance,
	}
	func (account *account) Deposite(money float64,pws string){
		if pwd != account.pwd {
			fmt.Println("你输入的密码不正确")
			return
			}
			//看看存款金额是否正确
			if money <= 0 {
			fmt.Println("你输入的金额不正确")
			return
			}
			account.balance += money
			fmt.Println("存款成功~~")
	}
	func (account *account) WithDraw(money float64, pwd string){
		if pwd != account.pwd {
			fmt.Println("你输入的密码不正确")
			return
			}
			if money <= 0 || money > account.balance {
				fmt.Println("你输入的金额不正确")
				return
				}
				account.balance -= money
				fmt.Println("取款成功~~")	
	}
	func (account *account) Query(pwd string) {
		//看下输入的密码是否正确
		if pwd != account.pwd {
		fmt.Println("你输入的密码不正确")
		return
		}
		fmt.Printf("你的账号为=%v 余额=%v \n", account.accountNo, account.balance)
		}
	}

二、面向对象编程三大特性-继承

1)语法

2)快速入门

package main
import(
	"fmt"
)
type Student struct{
	Name string
	Age int
	Score int
}
func (stu *Student)ShowInfo(){
	fmt.Printf("姓名:%v 年龄:%v 成绩:%v\n",stu.Name,stu.Age,stu.Score)

}
func (stu *Student)SetScore(score int){
	stu.Score=score
}
type pupil struct{
	Student
	
}
func (p *pupil)testing(){
	fmt.Println("小学生正在考试...")
}
type Graduate struct{
	Student
}
func (g *Graduate)testing(){
	fmt.Println("大学生正在考试...")
}
func main(){
	p:=pupil{}
	p.Name="tom"
	p.Age=18
	p.testing()
	p.SetScore(70)
	p.ShowInfo()

	g:=Graduate{}
	g.Name="tom"
	g.Age=18
	g.testing()
	g.SetScore(70)
	g.ShowInfo()
}

3)细节

  • 结构体可以使用嵌套匿名结构体所有的字段和方法
  • 匿名结构体字段访问可以简化
  • 结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字
  • 如果一个 struct 嵌套了一个有名结构体,这种模式是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字
  • 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值

三、 接口

1)为什么有接口

2)快速入门

package main
import(
	"fmt"
)
import()
type Usb interface{
	Start()
	Stop()
}
type Phone struct{

}
func (p Phone)Start(){
	fmt.Println("手机开始")
}
func (p Phone)Stop(){
	fmt.Println("手机结束")
}
type Camera struct{}
func (c Camera)Start(){
	fmt.Println("相机开始")
}
func (c Camera)Stop(){
	fmt.Println("相机结束")
}
type Computer struct{}
func (c Computer)Working(usb Usb){
	usb.Start()
	usb.Stop()
}
func main(){
	computer:=Computer{}
	phone:=Phone{}
	camera:=Camera{}
	computer.Working(phone)
	computer.Working(camera)
}

3)基本语法

  • 不包含变量
  • 接口中的方法没有方法体
  • 不需要显式的实现

4)注意细节

  • 、接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量
	var a Usb=phone
	a.Start()
	a.Stop()
  • 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
  • interface 类型默认是一个=指针(引用类型),如果没有对 interface 初始化就使用,那么会输出 nil
  • 空接口 interface{} 没有任何方法,所以所有类型都实现了空接口, 即我们可以把任何一个变量赋给空接口

4)实现接口 vs 继承
接口是继承的一种补充


四、面向对象编程三大特性-多态

type Usb interface{
	Start()
	Stop()
}
type Phone struct{
	name string
}
func (p Phone)Start(){
	fmt.Println("电话开始")
}
func(p Phone)Stop(){
	fmt.Println("电话结束")
}
func (p Phone)Call(){
	fmt.Println("手机在打电话")
}
type Camera struct{
	name string
}
func (c Camera)Start(){
	fmt.Println("相机开始")
}
func (c Camera)Stop(){
	fmt.Println("相机结束")
}
type Computer struct{}
func (c Computer)Working(usb Usb){
	usb.Start()
	usb.Stop()
}
func main(){
	var usbArr [3]Usb
	usbArr[0]=Phone{"vivo"}
	usbArr[1]=Phone{"小米"}
	usbArr[2]=Camera{"索尼"}
	var computer Computer

五、 类型断言

1)需求
把一个接口变量,赋值给自定义类型的变量
2)基本介绍
3)最佳实践1

package main
import "fmt"
type Usb interface{
	Start()
	Stop()
}
type Phone struct{
	name string
}
func (p Phone)Start(){
	fmt.Println("电话开始")
}
func(p Phone)Stop(){
	fmt.Println("电话结束")
}
func (p Phone)Call(){
	fmt.Println("手机在打电话")
}
type Camera struct{
	name string
}
func (c Camera)Start(){
	fmt.Println("相机开始")
}
func (c Camera)Stop(){
	fmt.Println("相机结束")
}
type Computer struct{}
func (c Computer)Working(usb Usb){
	usb.Start()
	phone,ok:=usb.(Phone);
	if ok{
		phone.Call()
	}
	usb.Stop()
}
func main(){
	var usbArr [3]Usb
	usbArr[0]=Phone{"vivo"}
	usbArr[1]=Phone{"小米"}
	usbArr[2]=Camera{"索尼"}
	var computer Computer
	for _,v :=range usbArr{
		computer.Working(v)
		fmt.Println()
	}
}


4)最佳实践2

func TypeJudge(item... interface{}){
	for i,v:=range item{
		switch v.(type){
		case bool:
			fmt.Printf("%v个参数是bool类型,值是%v\n",i,v)
		case int:
			fmt.Printf("%v个参数是int类型,值是%v\n",i,v)
		}
	

	}
}
func main(){
	var n1=true
	var n2 int =23
	TypeJudge(n1,n2)
}


总结

本文仅仅简单介绍了Golang面向对象编程,此篇是通过b站尚硅谷Golang视频的学习做的笔记。

更多推荐

【golang面向对象编程】