首页 > 编程语言 >C#中seale关键字用法总结

C#中seale关键字用法总结

时间:2022-12-19 17:38:35浏览次数:42  
标签:关键字 C# void 密封 sealed 基类 seale 方法 public


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()"); }
}

 

标签:关键字,C#,void,密封,sealed,基类,seale,方法,public
From: https://blog.51cto.com/u_15917617/5953243

相关文章

  • C#读取txt文本文件的几种方式
    1.按行读取:每次读取一行内容,即遇到回车键才会停止。publicvoidreadfile(stringfilepath){if(!File.Exists(filepath)){......
  • C++ Assert()断言机制原理以及使用
    机器学习以及人工智能的学习需要扎实的数学功底才能走的更远,爬的更高,所以打好数学基础是关键,但无论工作学习都没有充足的时间去拿着书本一个字一个字的去学习了,这里我建议大......
  • C#中readonly与const区别
        1.const、readonly和staticreadonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;        2.const定义时必须指定初......
  • C# dataGridView常用功能
     1.鼠标选中一行删除此行: foreach(DataGridViewRowrindGView_countList.SelectedRows)       {        if(!r.IsNewRow)   ......
  • linux C的一些笔记
    1.主函数的入参 主函数类似定义intmain();intmain(intargs);intmain(intargs,char*av[]);可以无惨,可以接受参数输入,入参一般为命令行执行参数,比如  传......
  • C#-sealed 封装类的使用
    示例1:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacesingleton{publicclassmyClass1{///<summary>//......
  • MATLAB随机波动率SV、GARCH用MCMC马尔可夫链蒙特卡罗方法分析汇率时间序列|附代码数据
    全文下载链接:http://tecdat.cn/?p=27340 最近我们被客户要求撰写关于分析汇率的研究报告,包括一些图形和统计输出。波动率是一个重要的概念,在金融和交易中有许多应用。它......
  • C#之lock关键字 lock锁定语句
    lock下面的示例包含一个lockclassAccount{decimalbalance;privateObjectthisLock=newObject();publicvoidWithdraw(decimalamount)......
  • VS2010创建基于C/S的三层架构模型
    在VS2010环境下创建基于C/S架构的三层模型:基础知识准备:    三层:UI、BLL、DAL另加数据模型Model    Winform作为UI界面。1、创建空的解决方案      新......
  • opencv对于bmp图像像素值的读取和赋值
    #include<stdio.h>#include<cv.h>#include<highgui.h> voidmain(){   IplImage*img=cvLoadImage("c://fruitfs.bmp",1);   CvScalars;///获取像素值  ......