zoukankan      html  css  js  c++  java
  • golang如何体现面向对象思想

    Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。

    Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现的。

    Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等。

    Golang仅支持聚合和嵌入,提倡面向接口编程。

    Golang的封装通过struct(结构体)实现,继承通过匿名字段实现,多态通过interface(接口)实现

    封装

    在Java里面,我们使用public,private,protected关键字来作为变量或者函数的权限设置,但在Go语言中,GO语言只有大小写的区别,如果想把函数或者变量暴露在外部,那么就首字母大写,相反则小写。

    继承(匿名字段+匿名函数)

    匿名字段实现了成员变量的继承。

    type Person struct {
        Name string
        Age int
        Gender string
    } 
    
    type Student struct {
        Person //通过匿名组合方式嵌入了Person属性
        Score float64
    }

     在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

    package main
    
    import "math"
    import "fmt"
    
    type Point struct {
        x float64
        y float64
    }
    
    func TraDistance(p1 Point, p2 Point) float64 {
        return math.Hypot(p1.x-p2.x, p1.y-p2.y)
    }
    func (p1 Point) ObjDistance(p2 Point) float64 {
        return math.Hypot(p1.x-p2.x, p1.y-p2.y)
    }
    func main() {
        p1 := Point{10, 20}
        p2 := Point{20, 10}
        old_len := TraDistance(p1, p2)
        new_len := p1.ObjDistance(p2)
        fmt.Println("The result of old method is ", old_len)
        fmt.Println("The result of OBJ method is ", new_len)
    }

    多态(interface)

    特点

    1. interface 是⽅法声明的集合

    2. 任何类型的对象实现了在interface 接⼝中声明的全部⽅法, 则表明该类型实现了该接⼝。

    3. interface 可以作为⼀种数据类型, 实现了该接⼝的任何对象都可以给对应的接⼝类型变量赋值

    注意

    a. interface 可以被任意对象实现,⼀个类型/对象也可以实现多个 interface  

    b. ⽅法不能重载,如 eat(), eat(s string) 不能同时存在

    interface⼀定要和多态的特性结合

    多态的三要素

    1 有⼀个⽗类的接⼝(抽象)

    2 有⼦类重写⽗类的全部接⼝⽅ 法

    3 ⽗类(接⼝类型) 指针/引⽤ 指 向⼦类对象

    ⼀旦有interface出现 ,⼀定要针对interface去写业 务

    多态具有架构思想和调⽤未来代码的意义

    ⾯向对象的开闭原则

    给⼀个类添加⼀个新的功能,不需要修改该类,⽽是通过额外的 添加代码来实现,保证了之前原有系统的安全性

    ⾯向对象的依赖倒转原则

    抽象层

    先设计抽象层接⼝,实现⼀个⼀个的interface

    设计难度较⼤,不要轻易修改

    实现层

    ⾯向抽象层 是实现具体的类,将接⼝全部实现

    业务逻辑层

    ⾯向抽象层,去编织业务逻辑

    总结:接⼝的意义 多态的思想 调⽤未来

  • 相关阅读:
    Good Bye 2014 B. New Year Permutation(floyd )
    hdu 5147 Sequence II (树状数组 求逆序数)
    POJ 1696 Space Ant (极角排序)
    POJ 2398 Toy Storage (叉积判断点和线段的关系)
    hdu 2897 邂逅明下 (简单巴什博弈)
    poj 1410 Intersection (判断线段与矩形相交 判线段相交)
    HDU 3400 Line belt (三分嵌套)
    Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)
    Codeforces Round #179 (Div. 2) B. Yaroslav and Two Strings (容斥原理)
    hdu 1576 A/B (求逆元)
  • 原文地址:https://www.cnblogs.com/peteremperor/p/13706226.html
Copyright © 2011-2022 走看看