首页 > 文章列表 > 深入探讨 Golang 函数接口与抽象类的异同

深入探讨 Golang 函数接口与抽象类的异同

抽象类 函数接口
219 2024-04-23

函数接口与抽象类均用于代码可重用性,但实现方式不同:函数接口通过引用函数,抽象类通过继承。函数接口不可实例化,抽象类可实例化。函数接口必须实现所有声明的方法,抽象类可只实现部分方法。

深入探讨 Golang 函数接口与抽象类的异同

Go 函数接口与抽象类的异同

在 Go 语言中,函数接口和抽象类是两种重要的概念,它们都用于表示行为和提供代码的可重用性。然而,两者在实现方式和使用场景上有所不同。

函数接口

函数接口是一种引用具有特定签名的函数的类型。它定义了函数的输入和输出参数,但不需要实现函数体。

语法:

type fnType func(parameters) (returnType)

示例:

type Handler func(w http.ResponseWriter, r *http.Request)

抽象类

抽象类是只包含声明而没有实现的类。它定义了一个接口,要求子类实现这些声明。

语法:

type Interface interface {
    Method1()
    Method2()
}

异同

相同点:

  • 都提供代码可重用性,允许创建可替换的组件。
  • 都可以被不同的类型实现。

不同点:

  • 实现方式: 函数接口通过引用函数来实现,而抽象类通过继承来实现。
  • 可实例化性: 函数接口不能被实例化,而抽象类可以。
  • 实现选择: 函数接口必须实现所有声明的方法,而抽象类可以只实现部分方法。
  • 语法: 函数接口使用 func 关键字,而抽象类使用 interface 关键字。

实战案例

函数接口:

可以使用函数接口来创建松散耦合的代码,允许不同的组件使用不同的实现。

type Shape interface {
    Area() float64
}

type Square struct {
    Side float64
}

func (s *Square) Area() float64 {
    return s.Side * s.Side
}

type Circle struct {
    Radius float64
}

func (c *Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

func CalculateArea(shapes []Shape) float64 {
    totalArea := 0.0
    for _, shape := range shapes {
        totalArea += shape.Area()
    }
    return totalArea
}

抽象类:

可以使用抽象类来定义公共的行为,并允许子类根据需要实现或覆盖这些行为。

type Animal interface {
    Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
    return "Woof!"
}

type Cat struct{}

func (c Cat) Speak() string {
    return "Meow!"
}