C#中seale关键字用法总结

来源:互联网 发布:优化排名 编辑:程序博客网 时间:2024/05/16 15:59

1.密封类与密封方法

       如果所有的类都可以被继承,那么很容易导致继承的滥用,进而使类的层次结构体系变得十分复杂,这样使得开发人员对类的理解和使用变得十分困难,为了避免滥用继承,C#中提出了密封类的概念。

       密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。密封可以防止对库的类型和成员进行自定义

 

2. 密封类的声明

       C#中声明抽象类时需要使用sealed关键字,具体语法格式如下。

     访问修饰符 sealed class 类名:
基类或接口
{
//类成员
}

说明:① 密封类不能作为基类被继承,但它可以继承别的类或接口。

② 在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。

③ 由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用。

 

示例e:

public sealed class myClass     //声明密封类    {        public int a = 0;        public void method()        {            Console.WriteLine("密封类");        }    }


3. 密封方法声明以及定义

       并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现,并提供具体的实现,所以,声明密封方法时,sealed修饰符总是和override修饰符同时使用。

 下面代码声明一个类myClass1,该类中声明一个虚方法Method,然后声明一个密封类myClass2,该类继承自myClass1类,在密封类myClass2中密封并重写myClass1类中的虚方法Method。实现代码如下。

public class myClass1    {        public virtual void Method()        {            Console.WriteLine("基类中的虚方法");}    }    public sealed class myClass2:myClass1    {        public sealed override void Method()  //密封并重写基类中的虚方法Method        {            base.Method();            Console.WriteLine("密封类中重写后的方法");        }    }

说明:上面代码中,密封并重写基类中的虚方法Method时,用到了base.Method();语句,该语句表示调用基类中Method方法。base关键字主要是为派生类调用基类成员提供一种简写的方法。

 

      密封类除了不能被继承外,与非密封类的用法大致相同,而密封方法则必须通过重写基类中的虚方法来实现。下面通过一个实例讲解如何在程序中使用密封类和密封方法。

 创建一个控制台应用程序,其中声明一个类myClass1,该类中声明了一个虚方法ShowInfo,用来显示信息。然后声明一个密封类myClass2,继承自myClass1类,在myClass2密封类中声明两个公共属性,分别用来表示用户编号和名称,然后密封并重写myClass1基类中的虚方法ShowInfo,并提供具体的实现。最后在主程序类Program的Main方法中实例化MyClass2密封类的一个对象,然后使用该对象访问myClass2密封类中的公共属性和密封方法。程序代码如下

 

public class myClass1    {        /// <summary>/// 虚方法,用来显示信息/// </summary>        public virtual void ShowInfo()        {        }    }    public sealed class myClass2 : myClass1       //密封类,继承自myClass1    {        private string id = "";          //string类型变量,用来记录编号        private string name = "";            //string类型变量,用来记录名称        /// <summary>/// 编号属性///         ///</summary>        public string ID        {            get{return id;}set{id = value;}        }        /// <summary>/// 名称属性/// </summary>        public string Name        {            get{return name;}            set{name = value;}        }        /// <summary>/// 密封并重写基类中的ShowInfo方法///         /// </summary>       public sealed override void ShowInfo()       {           Console.WriteLine(ID + " " + Name);       }    }    class Program    {        static void Main(string[] args)        {            myClass2 myclass2 = new myClass2();              //实例化密封类对象myclass2.ID = "BH0001";              //为密封类中的编号属性赋值            myclass2.Name = "TM";              //为密封类中的名称属性赋值            myclass2.ShowInfo();               //调用密封类中的密封方法}         }    }


结果为BH0001 TM结果为BH0001 TM运行结果为BH0001 TM。运行结果为BH0001 TM。运行结果为BH0001 TM。结果为BH0001 TM

 

sealed 修饰方法或属性
能够允许类从基类继承,并防止它们重写特定的虚方法或虚属性。

1)sealed是对虚方法或虚属性,也就是同override一起使用,如果不是虚方法或虚属性会报出错误:cannot be sealed because it is not an override

 

public class D{    /* ConsoleApplication1.MSFun.Sealed.D.M()'       * cannot be sealed because it is not an override       */    public sealed void M() { Console.WriteLine("D.M()"); }} 


2)防止子类重写特定的方法或属性2)防止子类重写特定的方法或属性

public class A{    protected virtual void M() { Console.WriteLine("A.M()"); }    protected virtual void M1() { Console.WriteLine("A.M1()"); }}public class B : A{    protected sealed override void M() { Console.WriteLine("B.M()"); }    protected override void M1() { Console.WriteLine("B.M1()"); }}public sealed class C : B{    /* ConsoleApplication1.MSFun.Sealed.C.M()':     * cannot override inherited member 'ConsoleApplication1.MSFun.Sealed.B.M()'     * because it is sealed */    //protected override void M() { Console.WriteLine("C.M()"); }    protected override void M1() { Console.WriteLine("C.M1()"); }}


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 dell电脑密码忘记了怎么办 手机锁屏为什么打不开怎么办 手机图形解锁忘记了怎么办 华硕电脑锁屏了怎么办 5s忘记解锁密码怎么办 苹果手机密码忘记了怎么办 苹果手机iphone已停用怎么办 手机被停用怎么办不用电脑 激活锁是别人的怎么办 6s开机密码忘了怎么办 苹果手机忘记解锁密码怎么办 忘记苹果触控id怎么办 苹果6app被锁了怎么办 捡的苹果id锁了怎么办 苹果手机id密码锁了怎么办 美版5s刷机后激活怎么办 vivo手机图案解锁忘记了怎么办 苹果5sid锁死了怎么办 苹果id账号被锁怎么办 苹果6s忘了ld怎么办 小米忘记图形解锁怎么办呢 索尼手机忘记解锁图案怎么办 oppoa37忘记锁屏密码怎么办 oppoa37锁屏密码忘了怎么办 oppor9图案密码忘了怎么办 oppor忘记锁屏图案怎么办 oppor手机忘记解锁图案怎么办 oppor手机忘记图案了怎么办 oppo手机屏幕锁忘了怎么办 三星手机屏幕锁忘了怎么办 手机主菜单坏了怎么办 索尼手机密码忘了怎么办 索尼笔记本密码忘了怎么办 索尼手机解锁密码忘了怎么办 索尼记录仪密码忘了怎么办 索尼z3手机忘记开机密码怎么办 索尼忘记锁屏密码怎么办 索尼手机忘记锁屏密码怎么办 忘了手机解锁图案怎么办 索尼手机忘记开机密码怎么办 索尼笔记本开机密码忘了怎么办