【C#】接口实现多态增强版

news2024/11/26 12:32:01

背景

在实际的生产中,会涉及到需要对接多种相似性较高的系统。具体而言就是业务接口是相同的,但是会出现接口的参数不同的情况。这时做一个对接隔离层就显得优势很明显了。这个隔离层的作用就有了两个基本的作用:
1、单一性,保护我们自己的软件系统的标准型。
2、可扩展性,通过隔离层对外实现对接系统的多样性。
使用 Interface 实现多态优势很明显。

  • 多态的五大好处
    • 可替换性(substitutability):多态对已存在代码具有可替换性。
    • 可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
    • 接口性(interface-ability):多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
    • 灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率。
    • 简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

实现思路

定义一个业务接口 IBehavior 通过继承实现接口方法。

/// <summary>动物行为接口</summary>
public interface IBehavior
{
	/// <summary>运动</summary>
	public string Motion();

	/// <summary>叫声</summary>
	public string Sound();
}

两个实现类:小苗,小狗

  • 小猫类
/// <summary>小猫行为</summary>
public class CatBehavior : IBehavior
{
	public string Motion()
	{
		return "爬树";
	}

	public string Sound()
	{
		return "小猫,喵喵";
	}
}
  • 小狗类
/// <summary>小狗行为</summary>
public class DogBehavior : IBehavior
{
	public string Motion()
	{
		return "游泳";
	}

	public string Sound()
	{
		return "小狗,汪汪";
	}
}

如何使用不同的实现类,在 .NET Core 中可以使用 依赖注入 的形式调用。但是在低版本的 .NET Framework想要使用 依赖注入 就有些困难了,并且很多项目也并没有使用到,这时引入依赖注入就显得大材小用了。
但是又想要自动的实例化所需对象,一般会想到使用条件判断的形式,根据不同的条件来实例化相应类的对象。这种形式简单直接,缺点也很明显就是可维护性差、可读性也不高。
可以引入设计模式来解决这个困局。

消除条件判断语句

条件判断语句是常规代码中非常的常见,毕竟是基础语法,但也不是非用不可。
这里我们就引入设计模式来消除:
工厂 + 策略

首先我们要创建一个工厂用来制造不同实现类的对象,然后通过策略来调出工厂所对应的实例对象。

在 Java 中有 MapHashMap 可以用来当作工厂,但是在 C# 中没有直接的 Map 类型。

C# 中我们可以使用 IDictionary 类型

  • 首先给工厂定义产品类型,这里使用枚举定义
/// <summary>小动物枚举</summary>
public enum Animal
{
	Tom,
	Jerry,
	Spike
}
  • 定义工厂,及可以生产制造的产品
static IDictionary<Animal, IBehavior> drBehavior = new Dictionary<Animal, IBehavior>()
{
	{Animal.Tom, new CatBehavior()},
	{Animal.Spike, new DogBehavior()}
};
  • 给一个出货口,定义调用接口APIs
public static IBehavior GetMethod(Animal animal)
{
	IBehavior behavior = default;
	drBehavior.TryGetValue(animal, out behavior);
	return behavior;
}

至此我们已经消除了对条件判断语句的依赖。

  • 看看我们的成果

info

模拟实现代码

Shared.GetMethod(Animal.Tom).Sound().Dump();

/// <summary>公服</summary>
public class Shared
{
	static IDictionary<Animal, IBehavior> drBehavior = new Dictionary<Animal, IBehavior>()
	{
		{Animal.Tom, new CatBehavior()},
		{Animal.Spike, new DogBehavior()}
	};

	public static IBehavior GetMethod(Animal animal)
	{
		IBehavior behavior = default;
		drBehavior.TryGetValue(animal, out behavior);
		return behavior;
	}
}

/// <summary>小动物枚举</summary>
public enum Animal
{
	Tom,
	Jerry,
	Spike
}

/// <summary>小猫行为</summary>
public class CatBehavior : IBehavior
{
	public string Motion()
	{
		return "爬树";
	}

	public string Sound()
	{
		return "小猫,喵喵";
	}
}

/// <summary>小狗行为</summary>
public class DogBehavior : IBehavior
{
	public string Motion()
	{
		return "游泳";
	}

	public string Sound()
	{
		return "小狗,汪汪";
	}
}

/// <summary>动物行为接口</summary>
public interface IBehavior
{
	/// <summary>运动</summary>
	public string Motion();

	/// <summary>叫声</summary>
	public string Sound();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络】- TCP/IP四层(五层)协议 - 物理层

目录 一、概述 二、物理层的基本概念 三、OSI 参考模型  &#x1f449;3.1 导引型传输媒体  &#x1f449;3.1 导引型传输媒体 一、概述 TCP/IP 在最初定义时&#xff0c;是一个四层的体系结构&#xff0c;包括应用层、传输层、网络层、网络接口层。不过从实质上来讲&#xf…

Makefile基础教程(变量的高级主题,变量的拓展)

文章目录 前言一、变量值的替换1.简单替换2.模式替换1.变量的模式替换2.规则中的模式替换 二、变量值的嵌套三、命令行变量四、define和override五.环境变量六.局部变量七.模式变量 总结 前言 本篇文章将给大家讲解一下变量的高级主题&#xff0c;变量的拓展&#xff0c;这些主…

详解C++类和对象(下篇)

目录 一&#xff0c;再谈构造函数 1.1 构造函数体赋值 1. 2 初始化列表 1.21 自定义类型成员 1.22 const 成员变量 1.23 引用成员变量 1. 24 初始化列表的“坑” 1. 3 explicit 关键字 二&#xff0c;static 成员 2.1 概念 2.2 特性 三&#xff0c; 友元 3.…

阿里云数据库RDS MySQL Serverless测评

文章目录 1. 背景2. 概念3. 操作步骤3.1 购买产品3.2 配置RDS账号3.3 设置网络访问权限3.4 连接实例 4. 与自建数据库相比的优势4.1 弹性设置4.2 监控比较直观4.3 报警比较灵活4.4 备份更安全、更方便 5. 总结 1. 背景 作为一枚程序员&#xff0c;在日常工作中少不了跟云产品打…

Linux C/C++并发编程实战(0)谈谈并发与并行

作为并发编程的第一讲&#xff0c;比较轻松&#xff0c;我们先来谈谈什么是并发和并行。 并发&#xff08;Concurrency&#xff09;是指一个处理器同时处理多个任务。 并行&#xff08;Parallelism&#xff09;是指多个处理器或者是多核的处理器同时处理多个不同的任务。 并发…

git rebase的理解

首先看下图 比如提价了三次&#xff0c;都是同一个文件的修改&#xff0c;有三次commit的信息 想把提交的版本信息变的好看一点&#xff0c;或者变成一次提交信息 // 这个表示要查看提交的三个版本并进行合并 git rebase -i HEAD~~~// 如何要合并多个版本 git rebase -i HEA…

媲美ChatGPT4的免费工具来了!傻瓜式教程不用魔法也能使用!

嗨呀 又是元气满满的一周啦 废话不多说直接进入正题&#xff0c;仅在注册时可能需要使用一些科学方法&#xff0c;使用完全无限制 优势 对中文的支持非常强大 无需魔法上网 不受限制 免费&#xff01;&#xff01;&#xff01; 实测优于ChatGPT3.5&#xff0c;略逊于4.0&…

vue-7:组件库(移动端vant)(PC端element)

移动端vant 插件安装&#xff08;按需导入&#xff09; 重启生效 # 通过 npm 安装 npm i unplugin-vue-components -D# 通过 yarn 安装 yarn add unplugin-vue-components -D 导入基于 vite 的项目&#xff1a; 如果是基于 vite 的项目&#xff0c;在 vite.config.js 文件中…

Git详细用法:Git概述 安装 常用命令 分支操作 团队协作 、GitHub、idea集成Git、idea集成GitHub、Gitee 码云、GitLab

0 课程介绍 说明&#xff1a; 在公司想要使用idea集成git&#xff1a; 首选需要下载安装Git&#xff08;查看第2章&#xff09;之后在中设置用户签名&#xff08;查看3.1&#xff09;然后在idea中集成Git&#xff08;查看第7章&#xff09;… 0.1 学习目标 第1章 Git 概述 …

高级语句(二)

一、VIEW&#xff08;视图&#xff09; 1、 概念 可以被当作是虚拟表或存储查询 视图跟表格的不同是&#xff0c;表格中有实际储存资料&#xff0c;而视图是建立在表格之上的一个架构&#xff0c;它本身并不实际储存资料。 临时表在用户退出或同数据库的连接断开后就自动消…

关于预处理器 sass 的超全用法

随着用户需求的增加&#xff0c;应用于页面的 css 代码越来越复杂越发臃肿难以维护&#xff0c;但是又没有 css 的替代品&#xff0c;css 预处理器作为 css 的扩展&#xff0c;出现在前端技术中。 sass 是 css 预处理器中常用的一种&#xff0c;它是一种动态样式语言&#xff0…

基于html+css图展示58

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

C++系列九:预处理功能

预处理功能 1. 宏定义2. 文件包含3. 条件编译4. 代码注释5. 预处理器注意事项6. 总结 预处理器是 C 编译器提供的一个工具&#xff0c;允许程序员在编译之前对源代码文件做出修改。它主要是根据在代码中命名实体的定义&#xff08;如宏、条件编译指令&#xff09;、源文件调用等…

分布函数有什么意义?

累积分布函数&#xff08;CDF&#xff09;有什么意义&#xff1f; 参考文献&#xff1a;姜咏梅. 浅析分布函数的意义与应用[J]. 科学与财富,2014(10):207-207,208. DOI:10.3969/j.issn.1671-2226.2014.10.183. 关于PMF、PDF、CDF的介绍&#xff0c;移步至我的笔记&#xff1a…

【SPSS】因子分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 因子分析 因子分析案例 因子分析

Clion开发STM32之OTA升级模块(一)

什么是OTA 百度百科解释个人理解&#xff1a;就是不通过烧录的方式&#xff0c;通过串口、网口、无线对主板运行的程序进行升级。减少后期的一个维护迭代程序的一个成本。 STM32的OTA升级模块的一个设计 程序启动的一个框架流程图(大致流程) FLASH的一个划分框图 BootLoader…

Nautilus Chain 或成未来最好的链上隐私生态

Nautilus Chain 目前仍旧处于测试网阶段&#xff0c;作为目前行业内首个&#xff0c;也是最受关注的 Layer3 模块化链&#xff0c;Nautilus Chain 在测试网早期阶段&#xff0c;整体就有着十分出色的数据表现。而该链有望在 6 月上线主网&#xff0c;面向更为广泛的开发者、用户…

分布式数据库设计与实现

分布式数据库设计与实现 摘要背景二期项目包括数据库选型分布式数据库设计数据集成测试部署分布式数据库扩展阅读 摘要 : 本文论述《金蚕工程》的分布式数据库的设计和实现。该项目的设计目标是实现企业间茧、丝等的合同交易&#xff08;交易规则和期货交易一样&#xff09;、…

【springcloud 微服务】springcloud openfeign使用详解

目录 一、前言 二、openfeign介绍 2.1 openfeign介绍 2.2 openfeign优势 三、Spring Cloud Alibaba整合OpenFeign 3.1 前置准备 3.2 代码整合过程 3.2.1 添加feign依赖 3.2.2 添加feign接口类 3.2.3 调整调用的方法 3.2.4 核心配置文件 3.2.5 接口模拟测试 四…

libevent介绍和使用

libevent介绍 libevent 是一个开源的事件通知库&#xff0c;它提供了一个跨平台的抽象接口&#xff0c;libevnet处理的事件包括网络IO事件&#xff0c;定时事件以及信号事件。它可以在不同的操作系统上使用&#xff0c;包括Linux、Windows和Mac OS X等。libevent 的主要目的是…