今天是学习C#第16天。。。
今天所学接口和泛型。
接口:
接口是什么:
接口是一组包含了类或结构可以实现的功能的定义。
关键词:
interface
命名一般以 I 为开头字母
接口方法是否有方法体?
接口可以包含事件,索引器,方法和属性,但是不能包含字段。
接口是一个引用类型,一般情况下只包含了功能的定义,不包含功能的实现
接口成员的访问级别是默认的
!!!
老师当时敲出接口方法时后面跟着方法体,然后不确定的和我们说,接口可以有方法体但一般不使用。同时他在定义方法时还尝试使用了下访问修饰符,public、protected可以,但private不行。
然而我一敲就报错,十分纳闷,通过问老师,查资料我终于知道了为什么:
我用的框架是.NET,而老师用的是.NET Core。而C#新版本才可以有方法体和访问修饰符。旧版本是不行的。
类与类之间,称之为继承
接口与接口,接口与类之间,称之为实现
interface IUSB_TypeC : IUSB, IRJ_45
{
}
示例:
class Computer : IUSB
{
public string USB_Type { get; set; }
public string ReadFile()
{
Console.WriteLine("正在读取文件...");
return "从删库到跑路.pdf"; }
public void WriteFile(string content) {
Console.WriteLine("正在写入文件..." + content);
}
public string ShowVideoData()
{
Console.WriteLine("正在显示视频数据...");
return "马克思思想.mp4"; } }
接口与抽象类的区别:
相同点:
两者都不能被实例化
两者都包含了由其他类或结构继承或实现的抽象成员
不同点:
抽象类当中除了拥有抽象成员外还可以拥有非抽象成员;而接口中所有的所有成员都是抽象的【新版本接口也可以实现普通方法】 Ø 抽象成员可以使用修饰符修饰,接口当中接口成员访问级别是默认不去修改的,并且默认是public
接口当中不可以包含构造方法,析构方法,常量
CSharp类只支持单继承,接口支持多支持
泛型:
方案一:
使用object(object是所有类型的基类,所有类型都是由他派生而来的,C#中的所有类都是间接或直接从System.Object类中继承。)
但会出现装箱、拆箱操作,这将在托管堆上分配和回收大量的变量,若数据量大,则性能损失非常严重。
在处理引用类型时,虽然没有装箱和拆箱操作,但将用到数据类型的强制转换操作,增加处理器的负担。
static void Swap(ref object var01,ref object var02)
{
object temp = var01;
var01 = var02;
var02 = temp;
}
class Program
{
static void Main(string[] args)
{
int a = 10;
int b = 20;
//将整型转换为object类型,向上转型,【值类型称呼:装箱操作】
object c = a;
object d = b;
Swap(ref c, ref d);
//将object转换为整型,向下转型,【值类型称呼:拆箱操作】
a = (int)c;
b = (int)d;
Console.WriteLine(a + "|" + b);
}
}
※※※※※※
方案二:
泛型参数:
1.泛型类型参数可以有多个
2.泛型类型参数可以是编译器识别的任何数据类型
3.泛型类型参数命名需要遵守命名规则(非强制性,英文字母就行)
使用描述性名称命名泛型类型,并且使用T作为前缀
单个字母名称完全可以让人了解其表示的含义使用单个大写字母命名
※泛型参数约束
为了防止传入的类型导致方法运行出错,可以对泛型进行一定的约束.。
通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量。
可以对多个参数应用约束,也可以对同一参数进行多个约束。
约束关键词:Where
where T : struct: 表示泛型T是值类型(小数,整数,char,bool,struct,enum)
where T : class : 表示泛型T是引用类型
where T : new() : 表示这个泛型具有一个无参数的构造方法,如果有多个约束,new()必须放在最后
where T : 基类名 : 表示这个泛型是该基类或者其派生类
where T : 接口名 : 表示泛型是实现了该接口的类型
where T:U : 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。
例:
void Test<T,U>(T p1,U p2) where U : struct
where T : Computer, new()
{
}
public static string CombineToString<T>(T value1, T value2)
{
return value1.ToString() + value2.ToString();
}
public static void Main(string[] args) {
Console.WriteLine(CombineToString<int>(234, 56));
}
//调用方法时,有些时候泛型类型可以省略
// Console.WriteLine(CombineToString (234, 56));
泛型方法的泛型重载:
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
//不同泛型参数,但只有一个不可以重载
// 如:void DoWork<T>() { }和 void DoWork<U>() { }