目录
泛型接口
一、泛型(generic)
泛型类是以实例化过程中提供的类型或类为基础建立的,可对对象进行强类型化
尖括号语法是把类型参数传送给泛型类型的方式
泛型并不限于类,还可以创建泛型接口、泛型方法(可以在非泛型类上定义),甚至泛型委托
泛化和特化是相对的
System.Collections.Generics名称空间的两个类型
类型:List<T> 说明:T类型对象的集合
类型:Dictionary<K,V> 说明:与K类型的键值相关的V类型的项的集合
前文已提及到:
二、为什么需要泛型类
场景:新百货商店开业,两个类,Chair类,Desk类
不同的货物要用不同的纸箱去装
类型膨胀
现在百货商店新开张,卖Chair和Desk,Chair需要用ChairCarton装,Desk需要用DeskCarton装;但是如果以后百货商店有1000种商品呢?要准备1000种纸箱吗?而且程序不好维护…
创建控制台项目
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Chair chair = new Chair() { Color = "Red" };
ChairCarton chairCarton = new ChairCarton() { Cargo = chair };
Console.WriteLine(chairCarton.Cargo.Color);
Desk desk = new Desk() { Weight = "20kg" };
DeskCarton deskCarton = new DeskCarton() { Cargo = desk };
Console.WriteLine(deskCarton.Cargo.Weight);
Console.ReadKey();
}
}
class Chair
{
public string Color { get; set; }
}
class Desk
{
public string Weight { get; set; }
}
class ChairCarton
{
public Chair Cargo { get; set; }
}
class DeskCarton
{
public Desk Cargo { get; set; }
}
}
成员膨胀
只准备一种纸箱,填写不同的属性,carton1实例只用到了Chair属性,没有用到Desk属性,而carton2属性则相反
以后1000种商品呢?Carton类1000个对应属性,只有1个属性能用,每次增加或减少商品,都要修改Carton类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Chair chair = new Chair() { Color = "Red" };
Desk desk = new Desk() { Weight = "20kg" };
Carton carton1 = new Carton() { ChairCargo = chair };
Carton carton2 = new Carton() { DeskCargo = desk };
Console.WriteLine(carton1.ChairCargo.Color);
Console.WriteLine(carton2.DeskCargo.Weight);
Console.ReadKey();
}
}
class Chair
{
public string Color { get; set; }
}
class Desk
{
public string Weight { get; set; }
}
class Carton
{
public Chair ChairCargo { get; set; }
public Desk DeskCargo { get; set; }
}
}
使用object类
当把东西往盒子里装时是省事了,但是要把东西从盒子里拿出来时,访问盒子中装的东西就很麻烦
(chair实例赋值给Cargo属性,在Console.WriteLine(carton1.Cargo.时,系统在可选择下拉框中,就已经找不到chair实例下的有关属性Color,需要强制类型转换/as属性操作符)
使用?.的原因:若是个Chair类则打印Color属性,若是Desk类则不会打印Color属性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Chair chair = new Chair() { Color = "Red" };
Desk desk = new Desk() { Weight = "20kg" };
Carton carton1 = new Carton() { Cargo = cha