继承和多态
接口与抽象类的区别:1、在接口中仅能定义成员,但是不能有具体的实现;抽象类除了抽象成员以外,其他成员有具体的实现。2、在接口中不能声明字段,并且不能声明任何私有成员,成员不能包含任何修饰符;在抽象中能声明任何成员,并能使用任何修饰符来修饰。3、接口中能实用类或者结构体来继承,但抽象类仅能使用类继承。4、在使用类来实现借口时,必须隐式或者显式地实现接口中的所有成员,否则需要将实现类定义为抽象类,并将接口中未实现的成员以抽象的方式实现;在使用类来继承抽象类时允许实现全部或部分成员,但仅实现其中的部分成员,其实现类必须也定义为抽象类。5、一个接口允许继承多个接口,一个类只能有一个父类。
实现多态的两种方式: a.使用父类作为方法形参实现多态 b.使用父类作为方法返回值实现多态
sealed关键词的用法:
当一个类的方法被标识为virtual,则表示该方法为虚方法,虚方法可以后代所重写(后代包括子类、以及子类的子类)
sealed关键字可以有两种用途:
1、可以修饰在带有override的方法上,用来阻止其子类进一步重写该方法。
2、可以修饰到类上,用来阻止类被继承
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 class Test11_0
2 {
3 public virtual string Fun()
4 {
5 return "这是类Test11_0";
6 }
7
8 }
9
10 class Test11_1 : Test11_0
11 {
12 public override string Fun()
13 {
14 return "这是类Test11_1";
15 }
16 }
17 class Test11_2 : Test11_1
18 {
19 public override string Fun()
20 {
21 return "这是类Test11_2";
22 }
23 }
24
25 class Test11_3 : Test11_2
26 {
27 public override string Fun()
28 {
29 return "这是类Test11_3";
30 }
31 }
32 class Test12_0
33 {
34 public virtual string Fun()
35 {
36 return "这是类Test12_0";
37 }
38 }
39 class Test12_1:Test12_0
40 {
41 public sealed override string Fun()
42 {
43 return "这是类Test12_1";
44 }
45
46 }
47
48 class Test12_2 : Test12_1
49 {
50 //这个类就不能再重写fun方法了
51 }
52
53 sealed class Test13//该类不能被继承
54 {
55
56
57 }
虚方法跟抽象方法的区别:总结:抽象方法是只有方法名称,没有方法体(也就是没有方法具体实现),子类必须重写父类抽象方法;虚函数是该方法有方法体,但是子类可以覆盖,也可不覆盖。(1)虚方法有方法体,抽象方法没有方法体。抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;(2)抽象方法只能在抽象类中声明,虚方法不是;(3)派生类必须重写抽象类中的抽象方法,虚方法则不必要。
集合和泛类
集合与数组的区别:1、数组声明了元素的类型,集合不声明;2、数组是静态的,有固定大小,创建了就无法改变容量,而集合是动态扩展容量,可以根据需要改变大小;3、数组存放类型只能是一种,集合可以不是一种;4、数组易于存放与查找。
HashTable跟SortedList的区别:2者都是表示键/值对的集合,hashtable是没有排序的,所以新增元素会比较快,而SortedList 存储的键值对,是按key进行排序了的,因为要排序,所以新增元素时,要先查找元素的位置再插入,相对慢些,但是在查找时比较快