一、接口 (实现多态的第三种方法,前面两种是:1. 虚方法;2抽象类) 当类需要多继承的时候,使用接口代替多继承
接口就是一种规范或一种能力 ----继承了这种接口后拥有这种规范或这种能力
1、语法:
[public] interface 接口名 ------接口名命名规则: I.....able 表示接受某种能力
{
void Fly(); //接口中不能包含字段
string Test(); // 接口成员不允许定义(没有方法体)
}
2、接口特征:
1、接口中不能包含字段和构造函数
2、接口成员不允许定义(没有方法体)
3、接口中的成员不能加访问修饰符,默认是public; 类中的成员默认是private
4、接口可以有:方法、自动属性(没有方法体)、索引器、事件,这三个本质上也就是方法,所以可以说接口只有方法
5、接口的子类必须实现所继承接口的所有成员,否则报错
6、为了多态,接口不能被实例化!也就是说接口不能new(创建对象)
7、接口之间可以继承,并且可以多继承(类不允许)
8、子类同时继承父类和接口的时候,父类必须在接口之前
接口是C#最重要的一个多态
面向对象编程,大多说的就是面向接口编程!
接口在实现多态过程中,类似于父类的用法
3、显示实现接口
显示实现接口是了解决方法的重名问题
三种多态实现方式已经学习完毕,回顾比较一下:
什么时候用虚方法
什么时候用抽象类
什么时候用接口
能找到父类,但是需要实现多态的方法不能确定怎么写 ----用抽象类
能找到父类,需要实现多态的方法可以写 -----用虚方法
不能找到共同父类,或拥有某种相同能力 ----用接口
二、超市收银系统之商品类
1、先提取父类:参考所有商品的共性,商品父类的成员大概有:价格Price、数量count、编号ID(用Guid类产生不重复数字),写三个自动属性,并在构造函数中赋值
2、在分别写子类,和子类初始化构造方法
3、仓库类
1)存储货物:所有货物集合list
list<list<product>> list = new list<list<product>>;
list<product>代表货架 ,所有货物用货架集合组成,货架又由货物组成
待
2)提货 :待
3)进货 :待
4、超市类 : 待
三、MD5加密
1、定义个专门取得MD5的方法
public static string GetMD5(string str)
参数是要加密的字符串,返回值是加密好的字符串
2、开始实现此方法的方法体
MD5是抽象类,不能创建对象,但是有一个Create方法模拟实例化
MD5 md5 = MD5.Create();
3、需要把参数转成字节数组,才能作为参数给对象MD5使用
byte[] buffer = Encoding.Default.GetBytes(str);
4、使用对象md5的方法,完成转换
byte[] MD5Buffer = md5.ComputeHash(buffer);
将需要加密的字符串的字节数组,代入转换,返回加密后的字节数组
5、将加密后的字节数组转回字符串
将字节数组转换成字符串有三种方法:字节数组 ---- 字符串
1)、解码(按编码同样的格式):将字节数组中的每个元素按照指定的编码格式解析成字符串
string str = Encoding.Default.GetString(buffer);
编码格式基本包括:Default、 UTF8、 GetEncoding("GBK")
2)、直接将数组ToString()----结果是命名空间
3)、将字节数组中的每一个元素ToString()
第一种和第二种都不行,选用第三种
string result = "";
for(int i = 0;i<MD5buffer.Length;i++)
result += MD5buffer[i].ToString("x2");
<pre name="code" class="html">ToString("x2")
里面的参数是输出格式的类型
x ----> 输出16进制的字符串
c-----> 输出带钱符号的字符串
x2 ---->补齐0位的 16进制字符串 (作用:对齐位数)