对泛型的一些理解

本文探讨了.NET中泛型方法的应用,特别是在处理不同实体类时如何通过定义基类来实现方法的通用性,避免重复代码,并展示了具体的实现方式。

看到很多程序员都喜欢用IList作为返回类型:实体类作为参数,泛型参数可以是值类型,也可以是引用类型,ProductInfo可以是其他对象,这我知道,可问题在这,这里放其他类型有意义吗,比如把ProductInfo改成其他的实体类,下面的很多代码还是得改啊,比如
ProductInfo product = new ProductInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4));再说每个实体类的属性肯定是不一样的。我真不知道这样传入一个实例有什么好处,如果我要用另外一个实体,或者要另外返回一个string,还不是一样要重新写过一个方法呢?

 

public IList<ProductInfo> GetProductsByCategory(string category) {
            IList
<ProductInfo> productsByCategory = new List<ProductInfo>();
            SqlParameter parm
= new SqlParameter(PARM_CATEGORY, SqlDbType.VarChar, 10);
            parm.Value
= category;
           
using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_PRODUCTS_BY_CATEGORY, parm)) {
               
while (rdr.Read()) {
                    ProductInfo product
= new ProductInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4));
                    productsByCategory.Add(product);
                }
            }

           
return productsByCategory;
        }

 

"泛"是指定义的时候,而非使用的时候。

因此如果想让上述方法实现通用。完全可以定义一个基类,自己用到的类都继承自基类BassClass

通用方法可写成:

public IList<BassClass> GetProductsByCategory(string category) {
            IList
<BassClass> productsByCategory = new List<ProductInfo>();
            SqlParameter parm
= new SqlParameter(PARM_CATEGORY, SqlDbType.VarChar, 10);
            parm.Value
= category;
           
using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_PRODUCTS_BY_CATEGORY, parm)) {
               
while (rdr.Read()) {
                    ProductInfo product
= new ProductInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4));
                    productsByCategory.Add(product);
                }
            }

           
return productsByCategory;
        }

 

 

等下试试。

 

### ArkTS 中的使用与解释 #### 什么是是一种编程技术,允许开发者编写灵活且可重用的代码。通过引入类参数,可以在编译时延迟具体类的绑定,从而实现更通用的功能[^1]。 --- #### 的基本概念 在 ArkTS 中,的核心思想是让函数、类或接口能够操作多种数据类而不局限于某一种特定的数据类。这提高了代码的灵活性和复用性。以下是几个关键点: 1. **类占位符** 使用 `<T>` 或其他字母作为类占位符,表示该位置可以接受任何具体的类。`T` 是最常见的约定俗成的名字,代表 Type (类)[^2]。 2. **动态类约束** 在运行时,可以根据传入的具体类自动调整行为,无需重复编写针对每种类的逻辑[^3]。 3. **默认类支持** 如果未显式提供类参数,则可以通过设置默认值来简化调用过程[^4]。 --- #### 如何声明并使用? ##### 1. 函数 ```typescript function identity<T>(arg: T): T { return arg; } let output = identity<string>("myString"); console.log(output); // 输出 "myString" ``` 此示例展示了一个简单的函数 `identity`,它接收任意类的输入,并返回相同的类[^3]。 ##### 2. 类 ```typescript class Box<T> { private content: T; constructor(content: T) { this.content = content; } getContent(): T { return this.content; } } const box = new Box<number>(123); console.log(box.getContent()); // 输出 123 ``` 这里定义了一个名为 `Box` 的类,它可以存储任意类的对象[^2]。 ##### 3. 接口 ```typescript interface KeyValuePair<K, V> { key: K; value: V; } function displayKeyValuePair<K, V>(pair: KeyValuePair<K, V>): void { console.log(`Key: ${pair.key}, Value: ${pair.value}`); } displayKeyValuePair({ key: "id", value: 1 }); // Key: id, Value: 1 ``` 这段代码演示了如何创建一个具有多个参数的接口以及基于它的函数[^3]。 ##### 4. 默认类参数 ```typescript function createArray<T = string>(length: number, value?: T): Array<T> { const result: Array<T> = []; for (let i = 0; i < length; i++) { result.push(value || ""); } return result; } console.log(createArray(3)); // ["", "", ""] console.log(createArray<number>(3, 42)); // [42, 42, 42] ``` 当省略类参数时,默认会采用字符串类;但如果指定了不同的类,则优先遵循后者。 --- #### 应用场景举例 - 数据结构设计:如栈、队列等容器类通常需要处理不同种类的对象。 - 工具库开发:为了增强适用范围,许多公共方法都会利用到机制。 - API 封装:对外暴露的服务端口可能涉及复杂的数据交互模式,借助能有效减少冗余编码工作量。 --- #### 总结 ArkTS 的功能极大地增强了程序表达能力,在保持强类安全的同时兼顾了高效性和简洁度。无论是构建基础组件还是高级框架,掌握好这一特性都将带来显著优势[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值