接口
可以理解成由于c#不支持多继承,于是出现了接口用来规定有相同特性的派生类;而接口就像是一个标准,符合标准的才能够与接口对接。
实现接口的任何类或结构必须实现其所有成员的方法。
接口不能直接实例化,但是可以通过指向子类间接实例化。
接口可以包含方法和属性的声明,但不能包含字段。
接口中所有方法、属性默认为public,不能在后面再添加修饰符。
类或结构可以实现多个接口。 类可以继承基类并实现一个或多个接口。
接口里可以实现方法的重载
接口和抽象类
接口与抽象类非常相似,它定义了一些未实现的属性和方法。所有继承它的类都继承这些成员,在这个角度上,可以把接口理解为一个类的模板。接口最终的目的是起到统一的作用。
两者都包含可以由子类继承的抽象成员;
两者都不直接实例化。
抽象类除拥有抽象成员之外,还可以拥有非抽象成员;而接口所有的成员都是抽象的。
抽象成员可以是私有的,而接口的成员默认是公有的。
接口中不能含有构造函数、析构函数、静态成员和常量。
C#只支持单继承,即子类只能继承一个父类,而一个子类却能够实现多个接口。
泛型
C#中的泛型能够将类型作为参数来传递,即在创建类型时用一个特定的符号如“T”来作为一个占位符,代替实际的类型,等待在实例化时用一个实际的类型来代替。
pubic class Test<T>{
public void Swap(T a,T b){
}
}
实例化时直接申明需要的参数类型
Test <string> t =new Test<string>();
t.swap("as","sd");
例二:
public class Test<T,U>{
public void swap(T a, U b){ }
}
实例化:
Test<string ,int> t=new Test<string, int>();
t.swap("one",1)
使用情况为:
经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处string数据(不同的数据类型),或者其他自定义的数据类型
优点:
一、使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。(重用代码既是保护代码安全的一种方式)
二、降低了强制转换或装箱操作的成本或风险。
三、可以对泛型类进行约束以访问特定数据类型的方法。
约束
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。 这些限制称为约束。 约束是使用 where 上下文关键字指定的。
public class Test<T> where T:struct{};//值类型
public class Test where T:class{};//引用类型