首页 > 其他分享 >代码大全多态

代码大全多态

时间:2024-08-01 10:10:04浏览次数:12  
标签:Draw Square 代码 多态 接口 Shaper Circle drawShape 大全

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

 

 

 

在面向对象编程中,多态是一种允许你通过一个接口使用多种类型对象的方法。在你提供的例子中,使用 `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` 接口即可。这样做提高了代码的可扩展性和可维护性,并且遵循了开闭原则(对扩展开放,对修改封闭)。
  

  

标签:Draw,Square,代码,多态,接口,Shaper,Circle,drawShape,大全
From: https://www.cnblogs.com/gongxianjin/p/18336047

相关文章

  • 向版权中心提交代码PDF文件时总是无法上传成功,怎么回事?
    在实际的补正提交的操作中遇到了该问题一开始找不到原因上传了十多遍都不行都是传完之后一闪而过显示红色叉号后来发现初次提交的代码pdf却可以正常上传推测是pdf本身格式差异,不符合系统提交要求本次提交的pdf是用wps的“输出为pdf”功能导出的才想到以前也遇到过wps输出......
  • 代码大全继承派生覆盖子程序,但没有任何操作
    派生后覆盖了某个子程序,但在其中没做任何操作,这种情况也值得怀疑这通常表明基类的设计中有错误。 举例来说,假设你有一个Cat(猫)类,它有一个Scratch()(抓)成员函数,可是最终你发现有些猫的爪尖儿没了,不能抓了。你可能想从Cat类派生一个叫scratchiesscat(不能抓的猫)的类,然......
  • 低代码如何借助 K8s 实现高并发支持?
    引言在当今这个数字化时代,互联网的普及和技术的飞速发展使得应用程序面临着前所未有的挑战,其中最为显著的就是高并发访问的需求。随着用户数量的激增和业务规模的扩大,如何确保应用在高并发场景下依然能够稳定运行、快速响应,成为了所有开发者和技术团队必须面对的重要课题。Kuber......
  • 如何在更改代码时自动运行代码?
    我有以下代码,它使用googlegeminiapi处理名为“pdf_texts_79_batch_#.txt”的文件。文件名中的“#”代表一个从1开始并依次递增的数字。我需要这样做,以便我可以运行代码,然后我可以将文件名中的数字更改为onqecutive数字,然后再次运行代码,所有这些都是自主的。例如,我的代码......
  • 将 HTTP 分块编码数据流代码片段从 Node.js 转换为 Python
    我有一个Node.js客户端代码,它将请求发送到HTTP服务器,然后连续接收分块编码数据。这是带有一些流量数据输出的Node.js代码。consthttp=require('http');constoptions={hostname:'...',path:'...',port:...,...};constreq=http.request(......
  • 有人可以帮我完成我作为我的第一个基本游戏编写的代码吗?
    最近,我做了一个项目,基本上是一只飞扬的小鸟(有点),你可以使用箭头键上下左右移动来躲避障碍物,我编写了用于创建和移动障碍物的代码。但它不起作用。我尝试搜索网络和所有内容,但仍然无法解决它。要了解我的期望,请参阅我从头开始制作的这个项目-DodgingGamefromiterto......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 代码随想录Day1
    704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:......
  • vue3 自定义渲染,渲染函数实现,配置渲染render函数,低代码配置自定义渲染函数核心实现
    代码父组件<template><divclass="component-name"><!--全局自动的icon--><Extend:render="render"/></div></template><scriptsetuplang="ts">import{ref,reac......
  • 植物大战僵尸代码及思路
    用C语言制作植物大战僵尸是一个相当复杂且具有挑战性的项目,以下是一个简单的概述步骤: 1. 游戏界面设计 -使用图形库(如SDL、OpenGL等)或者字符界面来创建游戏的窗口和显示区域。-设计游戏场景、植物、僵尸等元素的外观。2. 游戏逻辑 -定义植物和僵尸的属性、......