接口

 
go语言中没有类的概念,但可以利用接口模拟实现类的继承及多态
 
只要某结构体实现了某接口的所有方法,那么就可以说该结构体实现了该接口,接口的引用即可代表所有实现结构体
 
func main() {
    //创建三角形实例
    var t1 Triangle = Triangle{3, 4, 5}
    fmt.Println(t1.peri())
    fmt.Println(t1.area())
    fmt.Println(t1.a, t1.b, t1.c)

    //创建圆形实例
    var c1 Circle = Circle{4}
    fmt.Println(c1.peri())
    fmt.Println(c1.area())
    fmt.Println(c1.radius)

    //三角形t1实现接口
    var s1 Shape
    s1 = t1
    fmt.Println(s1.peri())
    fmt.Println(s1.area())

    //圆形c1实现接口
    var s2 Shape
    s2 = c1
    fmt.Println(s2.peri())
    fmt.Println(s2.area())

    testShape(t1)
    testShape(c1)
    testShape(s1)

    //实例
    var t2 *Triangle = &Triangle{3, 4, 2}
    fmt.Printf("t2:%T,%p\n",t2,&t2)

    getType2(t2)
}


func getType2(s Shape) {
    //断言实现
    switch ins := s.(type) {
    case Triangle:
    fmt.Println("三角形 ", ins.a, ins.b, ins.c)
    case Circle:
    fmt.Println("圆形 ", ins.radius)
    case *Triangle:
    fmt.Println("三角形结构体指针:",ins.a,ins.b,ins.c)
    }
}

//测试方法,参数可以传入接口Shape及其“子类”,体现多态
func testShape(s Shape) {
    fmt.Printf("周长:%.2f,面积:%.2f\n", s.peri(), s.area())
}

//创建接口
type Shape interface {
    peri() float64
    area() float64
}

//创建三角形结构体
type Triangle struct {
    a, b, c float64
}
//三角形结构体实现接口周长方法
func (t Triangle) peri() float64 {
    return t.a + t.b + t.c
}
//三角形结构体实现接口面积方法
func (t Triangle) area() float64 {
    p := t.peri() / 2
    s := math.Sqrt(p * (p - t.a) * (p - t.b) * (p - t.c))
    return s
}

//创建圆形结构体
type Circle struct {
    radius float64
}
//圆形结构体实现接口周长方法
func (c Circle) peri() float64 {
    return c.radius * 2 * math.Pi
}
//圆形结构体实现接口面积方法
func (c Circle) area() float64 {
    return math.Pow(c.radius, 2) * math.Pi
}

 

posted @ 2020-09-22 20:45  Edward_han  阅读(61)  评论(0编辑  收藏  举报