代码大全多态

尽量使用多态,避免大量的类型检查频繁重复出现的case语句有时是在暗示,采用继承可能是种更好的设计选择--尽管并不总是如此

 

 

 

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
在面向对象编程中,多态是一种允许你通过一个接口使用多种类型对象的方法。在你提供的例子中,使用 `switch` 或 `case` 语句来根据不同的形状类型调用不同的绘制方法,并不是最佳实践。相反,我们应该使用多态,让每个形状类实现一个共同的接口,并在其中定义一个 `Draw` 方法。
 
以下是如何使用 Go 语言来实现这个设计原则的示例:
 
```go
package main
 
import "fmt"
 
// Shaper 定义了形状的绘制接口
type Shaper interface {
    Draw()
}
 
// Circle 实现了 Shaper 接口
type Circle struct {
    // 可以包含圆特有的属性,比如半径
}
 
// Draw 实现了 Shaper 接口的 Draw 方法,用于绘制圆形
func (c *Circle) Draw() {
    fmt.Println("Drawing a circle.")
    // 这里添加绘制圆形的逻辑
}
 
// Square 实现了 Shaper 接口
type Square struct {
    // 可以包含正方形特有的属性,比如边长
}
 
// Draw 实现了 Shaper 接口的 Draw 方法,用于绘制正方形
func (s *Square) Draw() {
    fmt.Println("Drawing a square.")
    // 这里添加绘制正方形的逻辑
}
 
// drawShape 函数接受一个 Shaper 接口,根据实际类型调用相应的 Draw 方法
func drawShape(shape Shaper) {
    shape.Draw()
}
 
func main() {
    circle := Circle{}
    square := Square{}
 
    drawShape(&circle) // 输出: Drawing a circle.
    drawShape(&square) // 输出: Drawing a square.
}
```
 
在这个示例中:
 
- 我们定义了一个 `Shaper` 接口,其中包含一个 `Draw` 方法。
- `Circle` 和 `Square` 类型都实现了 `Shaper` 接口,因此它们都具有 `Draw` 方法。
- `drawShape` 函数接受一个 `Shaper` 接口参数,通过多态性,它可以调用任何实现了 `Shaper` 接口的类型的 `Draw` 方法。
- 在 `main` 函数中,我们创建了 `Circle` 和 `Square` 的实例,并使用 `drawShape` 函数来绘制它们,而不需要使用 `switch` 或 `case` 语句。
 
这种设计使得添加新的形状类型变得更简单,你只需要创建一个新的结构体并实现 `Shaper` 接口即可。这样做提高了代码的可扩展性和可维护性,并且遵循了开闭原则(对扩展开放,对修改封闭)。
  

  

posted @   易先讯  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2023-08-01 使用 Fluent API 创建更简单、更直观的代码
2023-08-01 GO 编程模式:FUNCTIONAL OPTIONS
2023-08-01 Markdown Nice
2022-08-01 Kubeedge Edged概述
点击右上角即可分享
微信分享提示