接口
接口是相当于一个大纲,列出方法,但不实现(只有方法名无方法内容).由类来实现接口.
c#中类是单继承.接口是多实现.即1个类只能继承1个类,但可以同时实现1个以上的接口.
一旦一个类实现了接口,就必须全部实现接口中定义的成员
接口不能实例化
在接口中定义方法:
1.不能添加访问修饰符,默认都是public
2.在接口中的方法不能实现.
public interface 语文{ int 语文成绩 { get; } void 学语文(); }
public interface 数学{ int 数学成绩 { get; } void 学数学(); }
public class 人类 { public string 姓名; }
//学生类继承了人类,并实现了两个接口:语文, 数学
public class 学生 : 人类, 语文, 数学 {
public int 语文成绩 { get { return 100; } }
public int 数学成绩 { get { return 100; } }
public void 学语文() {
Console.WriteLine(this.姓名 + "勤劳的学习语文.语文成绩:" + this.语文成绩);
}
public void 学数学() {
Console.WriteLine(this.姓名 + "勤劳的学习数学.数学成绩:" + this.数学成绩);
}
}
class Program {
static void Main(string[] args) {
//学生对象拥有全部从父类和接口继承的成员
学生 某某 = new 学生();
某某.姓名 = "小明";//该属性来自父类人类
某某.学语文();//该方法来自语文接口,由学生类实现
某某.学数学();//该方法来自数学接口,由学生类实现
//多态:使用语文接口new1个学生类的对象
//只拥有"语文"接口的成员"学语文()"方法和"语文成绩"属性
语文 甲 = new 学生();
甲.学语文();
//多态:使用数学接口new1个学生类的对象
//只拥有"数学"接口的成员"学数学()"方法和"数学成绩"属性
数学 乙 = new 学生();
乙.学数学();
Console.ReadKey();
}
}
泛型
public class Array {//自定义的数组类
public int this [int index] {//索引器
set { _arr[index] = value; }
get { return _arr[index]; }
}
public int Count {//属性
get { return _count; }
}
public void Add(int value) {
_arr[_count] = value;
_count++;
}
public void Log() {
string info = "当前数组共" + Count + "个元素:";
for (int i = 0; i < Count; i++) {
info += (_arr[i] + " ");
}
Console.WriteLine(info);
}
public Array() {//构造方法
_arr = new int[100];
}
private int[] _arr;
private int _count = 0;
}
class Program {
static void Main(string[] args) {
Array arr = new Array();
arr.Log();
arr.Add(12);
arr.Log();
arr.Add(88);
arr.Log();
arr.Add(101);
arr.Log();
arr[0] = 199;//使用索引器左值set
arr.Log();
//使用索引器右值get
Console.WriteLine("arr[1]=" + arr[1]);
Console.ReadKey();
}
}
如上代码,使用索引器可简单管理int类型数组.美中不足是只能使用int数组,如果使用别的类型(例如single,double等)数组,还要重新再写n份代码.
使用泛型可避免这种问题.
public class Array <T> {//自定义的泛型数组类
public T this[int index] {//索引器
set { _arr[index] = value; }
get { return _arr[index]; }
}
public int Count {//属性
get { return _count; }
}
public void Add(T value) {
_arr[_count] = value;
_count++;
}
public void Log() {
string info = "当前数组共" + Count + "个元素:";
for (int i = 0; i < Count; i++) {
info += (_arr[i] + " ");
}
Console.WriteLine(info);
}
public Array() {//构造方法
_arr = new T[100];
}
private T[] _arr;
private int _count = 0;
}
class Program {
static void Main(string[] args) {
//泛型类型数组在具体使用的时候,指定一个具体类型(例如single)定义使用
Array < Single > arr = new Array<Single>();
arr.Log();
arr.Add(12);
arr.Log();
arr.Add(88.88f);
arr.Log();
arr.Add(14.55f);
arr.Log();
arr[0] = 1.99f;//使用索引器左值set
//使用索引器右值get
Console.WriteLine("arr[1]=" + arr[1]);
arr.Log();
Array<string> arr2 = new Array<string>();
arr2.Add("张三");
arr2.Add("李四");
arr2.Add("王五");
arr2.Log();
Console.ReadKey();
}
}
-
使用泛型能够提高代码重用
-
使用泛型时,由于类型不确定,所以我们不能使用算术运算符
以上代码是错误的!由于num1,num2类型不确定,无法比较大小!
泛型使用大写字母含义:
泛型常用的大写字母含义
-
T - type
-
S/V/U - 第2,3,4种类型
-
K/V - key/value
-
N - number