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

1. 多态的定义

多态是一种允许不同类型的对象通过同一接口进行操作的能力。多态性使得程序可以处理不同类型的对象,而不需要知道对象的具体类型。Go语言通过接口来实现多态。

2. 使用接口实现多态

接口类型的变量可以存储任何实现了该接口的实例。

1
2
3
4
5
6
7
8
9
10
11
12
func PrintShapeInfo(s Shape) {
fmt.Printf("Area: %f\n", s.Area())
fmt.Printf("Perimeter: %f\n", s.Perimeter())
}

func main() {
r := Rectangle{Width: 3, Height: 4}
c := Circle{Radius: 5}

PrintShapeInfo(r)
PrintShapeInfo(c)
}

在上面的例子中,PrintShapeInfo函数接受一个Shape类型的参数,可以传入任何实现了Shape接口的对象,例如Rectangle和Circle。

3. 空接口

空接口(interface{})是一个不包含任何方法的接口,因此所有类型都实现了空接口。空接口常用于处理未知类型的数据。

1
2
3
4
5
6
7
8
9
func PrintAnything(i interface{}) {
fmt.Println(i)
}

func main() {
PrintAnything(123)
PrintAnything("hello")
PrintAnything(true)
}

4. 类型断言和类型转换

类型断言用于将接口类型的变量转换为具体类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func Describe(i interface{}) {
switch v := i.(type) {
case int:
fmt.Println("Integer:", v)
case string:
fmt.Println("String:", v)
default:
fmt.Println("Unknown type")
}
}

func main() {
var i interface{} = "hello"
Describe(i)
}

5. 示例

以下示例展示了如何使用接口和多态来定义不同类型的银行账户,并实现存款和取款操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main

import "fmt"

// 定义接口
type Account interface {
Deposit(amount float64)
Withdraw(amount float64) error
GetBalance() float64
}

// 定义结构体和方法
type SavingsAccount struct {
balance float64
}

func (a *SavingsAccount) Deposit(amount float64) {
a.balance += amount
}

func (a *SavingsAccount) Withdraw(amount float64) error {
if amount > a.balance {
return fmt.Errorf("insufficient funds")
}
a.balance -= amount
return nil
}

func (a *SavingsAccount) GetBalance() float64 {
return a.balance
}

type CheckingAccount struct {
balance float64
}

func (a *CheckingAccount) Deposit(amount float64) {
a.balance += amount
}

func (a *CheckingAccount) Withdraw(amount float64) error {
if amount > a.balance {
return fmt.Errorf("insufficient funds")
}
a.balance -= amount
return nil
}

func (a *CheckingAccount) GetBalance() float64 {
return a.balance
}

func main() {
var acc1 Account = &SavingsAccount{}
var acc2 Account = &CheckingAccount{}

acc1.Deposit(100)
acc2.Deposit(200)

fmt.Println("Savings Account Balance:", acc1.GetBalance())
fmt.Println("Checking Account Balance:", acc2.GetBalance())

acc1.Withdraw(50)
acc2.Withdraw(150)

fmt.Println("Savings Account Balance:", acc1.GetBalance())
fmt.Println("Checking Account Balance:", acc2.GetBalance())
}


/*
Savings Account Balance: 100
Checking Account Balance: 200
Savings Account Balance: 50
Checking Account Balance: 50
*/

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!