CH02_泛型

embedded/2024/11/20 13:23:55/

第2章:泛型


本章目标

  1. 理解泛型的概念

  2. 掌握泛型方法的定义与使用

  3. 掌握泛型类的定义与使用

  4. 掌握泛型接口的定义与使用

本章内容

泛型的概念

​ 泛型(generic)是C# 2.0推出的新语法,并不是语法糖,它是专门为处理多段代码在不同的数据类型上执行相同的指令的情况而设计的。 即泛型让不同的数据类型支持相同的业务逻辑。

​ 泛型是一个复合类型,把多个类型混合一起作用, 在C#中应用比较广的泛型:泛型方法,泛型类,泛型接口

泛型方法

泛型方法:调用时泛型参数类型可以省略

泛型定义时,是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。

c#">   		/// <summary>/// 泛型方法/// 求和/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t1"></param>/// <param name="t2"></param>/// <returns></returns>static object Fun1<T>(T t1,T t2){return Convert.ToDouble(t1) + Convert.ToDouble(t2);}/// <summary>/// 泛型方法/// 比较大小/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t1"></param>/// <param name="t2"></param>/// <returns></returns>static T Fun2<T>(T t1, T t2){double n1 = Convert.ToDouble(t1);double n2 = Convert.ToDouble(t2);return n1 > n2 ? t1 : t2;}
c#">	#region 测试泛型方法Fun1(23, 15);Fun1<int>(23, 15);Fun2(23.5, 18.9);Fun2<double>(23.5, 18.9);#endregion

泛型类

泛型类定义:在类名后

泛型类的作用域:整个类中

c#">/// <summary>/// 泛型类/// </summary>/// <typeparam name="T"></typeparam>public class MyArray<T>{T[] data;int size;public int Size { get => size; set => size = value; }public MyArray(){this.data=new T[10];}/// <summary>/// 添加/// </summary>/// <param name="item"></param>public void Add(T item){//栈满扩容if (this.data.Length==this.Size){this.AutoExpand();}this.data[Size++] = item;}/// <summary>/// 索引器/// </summary>/// <param name="index"></param>/// <returns></returns>public T this[int index]{get{return this.data[index];}set{this.data[index] = value;}}/// <summary>/// 自动扩容/// </summary>private void AutoExpand(){T[] newData = new T[this.data.Length*2];for (int i = 0; i < this.data.Length; i++){newData[i] = this.data[i];}this.data = newData;}}
c#">#region 测试泛型类MyArray<int> myArray = new MyArray<int>();myArray.Add(13);myArray.Add(24);myArray.Add(55);myArray[1] = 100;for (int i = 0; i < myArray.Size; i++){Console.WriteLine(myArray[i]);}#endregion

泛型接口

泛型接口和泛型类定义方式一样,在接口名称后使用未知类型

只是方法签名,没有方法体,默认是公开的,不能添加修改符

c#">/// <summary>/// 泛型接口/// </summary>/// <typeparam name="T"></typeparam>public interface MyInterface<T>{void Service(T t1, T t2);}/// <summary>/// 实现泛型接口的类/// </summary>public class MyClass1 : MyInterface<double>{public void Service(double t1, double t2){Console.WriteLine(t1+ t2);}}/// <summary>/// 实现泛型接口的类/// </summary>/// <typeparam name="T"></typeparam>public class MyClass2<T> : MyInterface<T>{public void Service(T t1, T t2){Console.WriteLine(Convert.ToDouble(t1)+Convert.ToDouble(t2));}}
c#">#region 测试泛型接口MyInterface<double> my1 = new MyClass1();MyInterface<int> my2 = new MyClass2<int>();my1.Service(2.3, 4.5);my2.Service(23,45);#endregion

本章总结

课后作业

1.在指定索引位置插入数据
1.检查索引的有效性
2.将索引位置到最后一个位置的所有元素向后平移一位(从最后一个元素开始)
3.将新数据插入到指定索引的位置
4.更新容器大小
2.移除首个元素
1.检查容器是否为空
2.将所以为1到末尾的所有元素向前平移一位(从索引为1的元素开始)
3.末尾清空
4.更新容器大小
3.移除尾个元素
1.检查容器是否为空
2.清空末尾
3.更新容器大小
4.移除指定索引的元素
1.检查索引的有效性
2.判断首尾元素,调用相应方法完成
3.将索引其后的所有元素向前平移一位
4.末尾清空
5.更新容器大小

5:泛型接口应用
1.定义泛型接口 IValidate<T>,包含数据验证的方法Check(T item);
2.定义实现类:
CheckName类实现接口,完成验证。(2-6个字)
CheckAge类实现接口,完成验证。(1-120)
CheckSex类实现接口,完成验证。(男或女)
3.编写测试类,完成验证功能
public bool CheckData( IValidate interface,T data){


http://www.ppmy.cn/embedded/139080.html

相关文章

Matlab 等离子体纳米粒子阵列中表面晶格共振的几何依赖性

在等离子体纳米粒子阵列中&#xff0c;表面晶格共振是一种重要的现象&#xff0c;它与纳米粒子阵列的几何结构密切相关。表面晶格共振是指当纳米粒子阵列中的粒子排列成特定的几何结构时&#xff0c;在电磁场的作用下&#xff0c;粒子表面会发生共振现象。对于纳米粒子阵列中的…

深入内核讲明白Android Binder【一】

深入内核讲明白Android Binder【一】 前言一、Android Binder应用编写概述二、基于C语言编写Android Binder跨进程通信Demo0. Demo简介1. 服务的管理者server_manager.c2. Binder服务端代码实现 test_service.c2.1 实现思路2.2 完整实现代码 3. Binder客户端代码实现 test_clie…

android studio -gradle Caused by: java.lang.NoClassDefFoundError -换版本方案

Caused by: java.lang.NoClassDefFoundError: org/gradle/internal/impldep/com/google/common/collect/Lists 降低一个版本 出错 hat went wrong: An exception occurred applying plugin request [id: com.android.application] > Failed to apply plugin [id com.andro…

1 设计模式原则之开闭原则

一、开闭原则 1.定义 开闭原则&#xff1a;对扩展开放&#xff0c;对修改关闭。 2.具体用法 在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。 想要达到这…

从0开始学习Linux——Shell编程详解【03】

期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开始…

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版&#xff0c;外加输入法、IDEA等&#xff0c;我想将这个虚拟机里的系统直接搬到物理机中&#xff0c;那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了&#xff0c;那直接说干就干。 本教程基于Ubuntu24.0…

【模型级联】YOLO-World与SAM2通过文本实现指定目标的零样本分割

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

函数指针数组,转移表

int (*arr[4])(int ,int) ,我们需要把数组名放到*的右边 函数指针数组的⽤途&#xff1a;转移表 可以让代码更加简单前提是函数类型相同 #include<stdio.h> int add(int x, int y) {return x y; } int sub(int x, int y) {return x - y; } int miv(int x, int y) {ret…