密封类就是将一个类封闭起来,断其子孙的一种方式。书面点说,就是从所修饰的类派生出其他类,所以一个密封类是没有也不能继承的类,因此sealed关键字和abstract关键字不能同时使用。
密封方法则不是为了防止继承而是防止重写,而且它是为了重写基类的虚方法并提供具体的实现,同时防止其后继类(派生类)再次重写该虚方法因此在密封方法中sealed关键字总是和override关键字同时使用。
这些都很简单但是代码总结起来还是不够直观,必须实际感受下:
1 using System;
2
3 namespace SealClassTest
4 {
5 public sealed class SealClass
6 {
7 public static void F()
8 {
9 Console.WriteLine("SealClass.F()");
10 }
11 }
12 /* public class TestSeal : SealClass
13 * { }
14 * error,The compiler's IntelliSense
15 * will not prompt "SealClass",Here just to test */
16 class A
17 {
18 public virtual void F()
19 {
20 Console.WriteLine("A.F()");
21 }
22 public virtual void G()
23 {
24 Console.WriteLine("A.G()");
25 }
26 }
27 class B : A
28 {
29 sealed public override void F()
30 {
31 Console.WriteLine("B.F()");
32 }
33 public override void G()
34 {
35 Console.WriteLine("B.G()");
36 }
37 }
38 class C : B
39 {
40 public override void G()
41 {
42 Console.WriteLine("C.G()");
43 }
44 /*
45 * error :
46 public override void F()
47 {
48 base.F();
49 }*/
50 }
51
52 class Test
53 {
54 public static void Main()
55 {
56 C c = new C();
57 B b = c;
58 A a=new A();
59 b.F();
60 a.F();
61 c.F();
62 Console.ReadKey();
63 }
64 }
65 }