抽象类,密封类,封装,继承,多态
封装
封装其实就是信息隐藏,隐藏一个对象的本质,让用户不再注意那些细节.提供一些向外的接口供别人使用。
就像电视的内部已经被封起来,你不需要知道它的内部是由哪些零件组成、如何工作。你只知道用遥控器来控制就好。
继承
继承可以理解为基类代码的复用.
当一个对象可以描述为另外一个对象的时候用继承(is-a)的关系.
当一个可以可以有另外一个对象的时候用组合(has-a)的关系.
当一个对象可以包含某个行为的时候用接口(can-do)的关系.
多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,
这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。
C#支持两种类型的多态性
编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。
编译时的多态性
编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。

abstract,virtual,override,new,sealed,base
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace DemoLib.Demo3
6

{
7
//需要熟练掌握 abstract,virtual,override,new,sealed,base的用法.
8
abstractClass 抽象类#region abstractClass 抽象类
9
/**//// <summary>
10
/// 抽象类
11
/// 可以将类声明为抽象类。方法是在类定义中将关键字 abstract 置于关键字 class的前面
12
/// </summary>
13
public abstract class abstractClass
14
{
15
private string mclassName;
16
17
/**//// <summary>
18
///
19
/// </summary>
20
/// <param name="mclassName"></param>
21
public abstractClass(string mclassName)
22
{
23
this.mclassName = mclassName;
24
}
25
26
ClassName 抽象属性#region ClassName 抽象属性
27
/**//// <summary>
28
///
29
/// </summary>
30
public virtual string ClassName
31
{
32
get
33
{
34
return mclassName;
35
}
36
}
37
#endregion
38
39
DoWork 抽象方法#region DoWork 抽象方法
40
/**//// <summary>
41
/// 抽象方法
42
/// 1.抽象类也可以定义抽象方法。方法是将关键字 abstract 添加到方法的返回类型的前面。
43
/// 2.抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。
44
/// 3.抽象类的派生类必须实现所有抽象方法。当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。
45
/// </summary>
46
/// <param name="i"></param>
47
public abstract void DoWork(int i);
48
#endregion
49
50
DoWork 虚方法#region DoWork 虚方法
51
/**//// <summary>
52
/// virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
53
/// 1.virtual 修饰符不能与 static、abstract、private 或 override 修饰符一起使用。
54
/// 2.在静态属性上使用 virtual 修饰符是错误的。
55
/// 3.除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
56
/// 4.通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
57
/// </summary>
58
/// <param name="message"></param>
59
public virtual void DoWork(string message)
60
{
61
62
}
63
#endregion
64
65
}
66
#endregion
67
68
DemoClass 继承抽象类 派生类#region DemoClass 继承抽象类 派生类
69
/**//// <summary>
70
/// 派生类可以包含与基类方法同名的方法
71
///1.基类方法必须定义为 virtual。
72
///2.如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
73
///3.如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
74
///4.如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。
75
///5.可以从派生类中使用 base 关键字调用基类方法。
76
///6.override、virtual 和 new 关键字还可以用于属性、索引器和事件中
77
/// </summary>
78
public class DemoClass : abstractClass
79
{
80
private string motherName;
81
82
DemoClass base的用法#region DemoClass base的用法
83
/**//// <summary>
84
///
85
/// </summary>
86
/// <param name="mclassName"></param>
87
/// <param name="motherName"></param>
88
public DemoClass(string mclassName, string motherName)
89
: base(mclassName)
90
{
91
this.motherName = motherName;
92
}
93
#endregion
94
95
ClassName 实现抽象属性#region ClassName 实现抽象属性
96
/**//// <summary>
97
///
98
/// </summary>
99
public string OtherName
100
{
101
get
102
{
103
return motherName;
104
}
105
}
106
#endregion
107
108
DoWork#region DoWork
109
/**//// <summary>
110
///
111
/// </summary>
112
/// <param name="i"></param>
113
public override void DoWork(int i)
114
{
115
116
}
117
#endregion
118
}
119
#endregion
120
121
sealedClass 密封类#region sealedClass 密封类
122
/**//// <summary>
123
/// 1.在class前使用 sealed 修饰符时会阻止其他类从该类继承.
124
/// 2.在重写基类中的虚方法或虚属性的方法或属性上使用.则他的继承类无法重写相应的方法或属性.
125
/// </summary>
126
public sealed class sealedClass : abstractClass
127
{
128
public sealedClass(string mclassName)
129
: base(mclassName)
130
{
131
}
132
133
DoWork 密封方法#region DoWork 密封方法
134
/**//// <summary>
135
///
136
/// </summary>
137
/// <param name="i"></param>
138
public sealed override void DoWork(int i)
139
{
140
141
}
142
#endregion
143
}
144
#endregion
145
}