通过继承,子类拥有父类的一切行为和属性;
任何父类出现的地方,都可以用子类来替代。
object是所有类型的父类;
延迟思想
- 推迟一切可以推迟的;
- 泛型就是用的一种延迟的思想;
- 延迟到使用的时候才知道具体的类型;
- 方法声明的时候没有指定参数类型,而是推迟到使用方法的时候才指定参数类型
声明
ShowT<T>(T tParameter)
T,占位符,可以随便写,通常使用单个字母;
T tParameter T类型的参数
调用
ShowT<DateTime>(dtParameter);
ShowT<People>(people);
ShowT<string>("hello");
泛型的参数个数可以随便定义
static void Show<T,S,W>(T t,S s,W w,int iParameter,string sParameter)ShowT("hello")
调用的时候,可以不传类型参数,可以自动推算
为什么要有泛型
- 泛型实际上是语法糖,有编译器提供的功能,调用泛型的时候会为调用方 生成相应的副本。
- 泛型方法,泛型接口,泛型类,在之后的学习中,泛型无处不在,非常的重要;
- 因为泛型是基于原始方法来使用(由编译器来转换),不像object需要装箱和拆箱,没有性能损失。
- 解决了把多个参数传到1个参数。
深入了解泛型
一个方法可以支持不同类型的参数
- 泛型方法之泛型返回,泛型不仅可以作为参数,还可以作为返回值类型
public static T Get<T>(int id)
- 泛型类
public class SomeGeneriClass<W,S,T,TI>{}
- 泛型接口
public interface GenericInterface<T,S,s>{}
- 泛型委托
public delegate GetDelegate<T>();
- 泛型的约束
public static T Get<T>(T t) where T: class
{return default(T);}
- 泛型约束声明后,类型参数必须满足约束
- 引用类型
where T:class
- 值类型
where T:struct
- 无参构造 new()
public static T Get<T>(T t) where T: class,new()
{
T ttt = new T();
return null;
//return default(T);
}
- 最实用的约束
public static void SayHi<T>(T t) where T : people
{
Console.WriteLine("ID={0},Name={1}",t.id,t.name);
//t必须是people类型或者people的子类
}