首页 > 其他分享 >GoLange:面向对象

GoLange:面向对象

时间:2023-08-22 11:34:17浏览次数:45  
标签:GoLange ... struct Person 面向对象 func type name

学习自:Go教程130页

1、类定义

方式:结构体+方法

  • 结构体:定义有哪些数据
  • 方法:定义结构体的方法

例子:定义一个Person类

//结构体定义人的属性
type Person  struct {
    name string
    age int
}

//方法定义人的行为
func (p Person)Say(){
    fmt.Println( "my name is" ,p.name, " my age is" ,p.age)
}

2、创建对象

对象名 := 结构体名{变量1,变量2,...}

例子  

p1 := Person{"lnj",33}
p1.Say()
p2 := Person{"zs",18}
p2.say()

3、不同包中变量、函数、方法、类型的公私有问题

在Go中通过首字母大小写控制公私有:

  • 首字母小写——私有,仅在当前包中使用
  • 首字母大写——公有,其他包中也可以使用

例子

//公有:其他包也可用
//私有:仅当前包可以用
var num1 int = 123//私有
var Num1 int = 123//公有

type person struct{//结构体 私有
    name string
    age int
}

type Student struct{//公有
    Name string
    Age int
}

func test1(){//函数 私有
    ...
}
func Test2(){//公有
    ...
}

func (p person)say(){//方法 私有
    ...
}

func (s Student)Say(){//方法 公有
    ...
}

4、面向对象三大特性及实现:继承、封装、多态

1)封装

说明

对外界隐藏数据特性,只暴露对数据操作相关的方法

实现

  • 类-公有
  • 类数据-私有
  • 类方法-公有

例子

package model
type Person struct{ //类名大写 公有
    name string        //数据小写 私有
    age int
}
func (p *person)SetAge(age int){//方法大写 公有
        p.age=age;
}


//下文省略包名,Person和main分属不同包
func main(){
    //不能直接在创建对象时就赋初值了
    //错误写法
    p := model.Person("lnj".18)

    //正确1
    p := model.Person()
    p.SetAge(18)

    //正确2
    p := new(model.Person)
    p.SetAge(18)

  

2)继承

Go中继承是通过组合实现的

组合:

type Person struct{
    ...
}

type Student struct{
    Person//继承了Person的特性
    ...
} 

①普通继承

type Person struct{
    name string
    age int
}

type Student struct{
    Person //Student继承了Person的特性
    score int
}
type Teacher struct{
    Person //Teacher继承了Person的特性
    Title string
}

//具体应用
func main(){
    s := Student{Person{"lnj",18},99}
//输出继承的父类的属性,两种方法 s.Person.name s.name
}

  

继承过程中出现了重名,则采用就近原则

例子:Person和Student中都有name属性

type Person struct{
    name string
    age int
}
type Student struct{
    Person
    name string
    score int
}


func main(){
    s := Student{Person{"zs",18},"ls",99}

    s.name        //Student自己的name即ls
    s.Person.name//父类的name即zs

②多重继承

A→B→C

A→C←B

type Object struct{
    life int
}
type Person struct{
    Object
    name string
    age int
}
type Student struct{
    Person
    score int
}

初始化

s := Student{Person{Object{77},"zs",33},99}

访问

//对于Object中无重名属性life,三种访问方式均可
s.life
s.Person.life
s.Person.Object.life

//对于Person中无重名属性name age,有两种访问方式
s.age
s.Person.age

//对于Student独有属性score,只能通过它的对象访问
s.score

③方法继承

一般继承

type Person struct{
    ...
}
//父类方法
func {p Person)say(){
    ...
}

type Student struct{
    Person
    ...
}

func main(){
    stu := Student{...}
    stu.say()//直接调用继承来的方法
}

重写(子类和父类存在同名方法)

type Person struct{
    ...
}
//父类方法
func (p Person)say(){
    ...
}

type Student struct{
    Person
    ...
}
func (s Student)say(){
    ...
}


func main(){
    stu := Student{...}
    stu.say()//直接调用,调用的是自己的方法
    stu.Person.say()//对用父类方法
}

3)多态

多态:一个事物多种状态(一个事物既是它自己,又是它的父类)

Go中通过接口实现多态

//定义接口Animal
type Animal interface{
    Eat()
}

//定义两个具体的类Dog、Cat
type Dog struct{
    name string
    age int
}
type cat struct{
    name string
    age int
}

//实现接口方法
func(d Dog)Eat(){...}
func(c Cat)Eat(){...}

//实现类特有方法
func(c Cat)Special(){...}
func main(){
    //1、生成接口对象
    var a Animal;

    //2、灵活表现为不同的对象(需要是实现接口方法的类)
    a=Dog{"旺财",18}
    a.Eat()

    a=Cat{"喵喵",18}
    a.Eat()

    //3、调用对象特有方法
    //但是只有对象才能调用自己的方法,接口无法调用接口中没有的方法,所以这里要用ok-idiom,断言机制
    if cat,ok := a.(Cat);ok{
        cat.Special()
    }

}

  

 

标签:GoLange,...,struct,Person,面向对象,func,type,name
From: https://www.cnblogs.com/ShineLeBlog/p/17648110.html

相关文章

  • 面向对象
    面向过程:核心是过程二字过程的终极奥义就是将程序流程化过程是‘‘流水线’’,是用来分步骤解决问题的面向对象:核心是‘‘对象’’二字对象的终极奥义就是将程序‘‘整合’’   对象就是‘‘容器’’,用来盛放数据与功能的类也是‘‘容器’’,该容器用来存......
  • 面向对象
    面向对象面向对象的三大特征封装继承多态封装在OOP中,封装(encapsulation)是指对于某个对象,Java隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数......
  • 学习笔记 - Java 面向对象_中
    this关键字当形参名和属性名相同时,使用this关键字来区分,有this修饰的变量是属性,无this修饰的是形参。this可以调用的除了属性,还有方法、构造器。所以,this指的是当前对象(在方法调用时)或当前正在创建的对象(在构造器中调用时)。在构造器中,使用this(形参列表);可以调用......
  • 面向对象 详解方案
    什么是面向对象初始面向对象方法回顾和加深对象的创建与分析面向对象三大特性抽象类与接口内部类及OOP实战面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二部做什么....面对过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模......
  • 基础面向对象
    面向对象基本概念面向对象三大特征:继承,封装,多态类就是设计图纸对象就是根据图纸造出来的实物类:对象共同特征的描述。一般一个代码文件里只写一个类对象:真实存在的具体实例类名对象名=new类名()创建对象时:类名对象名=new类名()等号左边是在给对象起名字、是在存对象的内存地址等......
  • 面向对象
    面向对象概述面向对象和面向过程的区别面向过程:优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展面向对象:优点:易维护、易复用......
  • 面向对象--继承
    继承概述在面向对象里面,继承是对类进一步抽象的过程。当多个类中存在相同属性和行为时,将这些相同属性和行为抽取到单独一个类中,这个类就是父类,子类无需再定义这些属性和行为,只要继承父类即可。其中,多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者*基类*。继承概念......
  • 面向对象编程
    面向对象编程多[多种]态[状态]基本介绍方法或对象具有多种状态,是面向对象的第三大特征多态的具体体现方法的多态对象的多态/*1.一个对象的编译类型和运行类型可以不一致2.编译类型在定义对象时,就确定了,不能改变3.运行类型是可以变化的4.编译类型看定义时=号的左......
  • 面向对象高级01
    面向对象高级一、类变量和类方法1.1类变量和类方法1.1.1static变量是对象共享的,不管static变量在哪里1.1.2共识:(1)static变量是同一个类的对象共享。(2)static变量在类加载的时候就已经生成了1.1.3什么是类变量?类变量也叫静态变量,是该类的所有对象共享的变量,任何一个该类的......
  • OOP:面向对象
    OOP:面向对象思想80年代,百花争名,OOP(面向对象编程)OOA(面向对象分析)OOD(面向对象设计)程序即现实:模拟现实世界万事万物皆对象核心:类和对象类是对象的抽象,对象是类的具体类:抽象的,模板,概念,是一些具体共同特征和行为的一类的定义对象:实际存在的,通过类来创建类的组成:属性(......