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

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

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