`
shirlly
  • 浏览: 1652364 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

c# seal的用法

    博客分类:
  • .NET
阅读更多
今天碰到sealed关键字,以前还真没有注意到过。上网,发现一个讲解的很容易理解。

sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写。
      

sealed关键字的作用:
    在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。
  sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。

密封类:
    密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。

  在哪些场合下使用密封类呢?实际上,密封类中不可能有派生类。如果密封类实例中存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual 不再生效。

  让我们看下面的例子:
abstract class AbstractClass
 {
       public abstract void Method( ) ;
 }

 sealed class SealedClass: AbstractClass
 {
        public override void Method( )
         { //... }
 }



如果我们尝试写下面的代码

class OtherClass: SealedClass
{ 
}



  C#会指出这个错误,告诉你SealedClass 是一个密封类,不能试图从SealedClass 中派生任何类。


密封方法:
    C#还提出了密封方法(sealedmethod) 的概念,以防止在方法所在类的派生类中对该方法的重载。对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法。

  不是类的每个成员方法都可以作为密封方法密封方法,要作为密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed 修饰符总是和override 修饰符同时使用。请看下面的例子代码:

using System ;

class A
 {
     public virtual void F( )
     { 
            Console.WriteLine("A.F") ; 
        }
     
        public virtual void G( )
     {   
            Console.WriteLine("A.G") ; 
        }
 }

 class B: A
 {
     sealed override public void F( )
   { 
            Console.WriteLine("B.F") ; 
         }
 
        override public void G( )
     {
             Console.WriteLine("B.G") ; }
     }

    class C: B
 {
    override public void G( )
     { 
            Console.WriteLine("C.G") ; 
        }
 }



类B 对基类A 中的两个虚方法均进行了重载,其中F 方法使用了sealed 修饰符,成为一个密封方法。G 方法不是密封方法,所以在B 的派生类C 中,可以重载方法G,但不能重载方法F。



转载自:http://www.cnblogs.com/iamdaiyuan/archive/2007/02/06/642442.html

----------------------------------------------------------------------
注意:sealed类中的属性和方法,可以是public类型或private类型,但不可以是protected类型的
protected 关键字是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。通过这样的解释来看,protected修饰的属性或方法,有被继承的意思,所以...(只是个人的猜测)

分享到:
评论

相关推荐

    c# listview 使用方法

    c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法...

    Seal Report使用说明.docx

    Seal Report 是一个开源报表工具,使用 C# 编写,基于 Microsoft .Net Framework 架构。该工具提供了一个完整的框架,用于从任何数据库生成日常报告和仪表板。 Seal Report 的主要特点包括: 1. 动态 SQL 源:使用...

    C#中DataSet的用法(很详细)

    更新数据库使用DataAdapter的Update方法,它会根据数据行的状态(如已修改、新增或已删除)执行相应的SQL命令(UpdateCommand、InsertCommand和DeleteCommand)。 3. 约束和验证:DataTable的Constraints集合允许...

    C#中DataBindings用法实例分析

    下面我们将通过实例详细分析C#中DataBindings的用法。 首先,我们来看一个简单的例子,如何使用DataBindings将TextBox控件的Text属性与TrackBar控件的Value属性绑定: ```csharp textBox1.DataBindings.Add("Text...

    C# RichTextBox的使用方法

    C# ,RichTextBox,使用方法 C# ,RichTextBox,使用方法 C# ,RichTextBox,使用方法 C# ,RichTextBox,使用方法 C# ,RichTextBox,使用方法 C# ,RichTextBox,使用方法 C# ,RichTextBox,使用方法

    C#panel用法例子

    C#网站制作学习到的panel用法例子,主要演示了怎么使用panel控制panel内部控件的显示、隐藏。例子是我从网上找的,我试过可以用。

    C#窗体中Invoke和BeginInvoke方法详解

    在探讨C#窗体中`Invoke`和`BeginInvoke`方法的使用及其重要性之前,我们首先需要理解.NET框架下的多线程与GUI操作的基本原则,以及为何这两者在跨线程更新GUI时不可或缺。 #### 一、为什么Control类提供了Invoke和...

    C#基础教程C# C# C# C#

    12. **命名空间(Namespace)**:C#使用命名空间来组织和管理代码,避免命名冲突。 13. **异构集合**:如ArrayList和LinkedList,它们分别基于数组和链表实现,适用于不同性能需求的场景。 14. **多线程编程**:C#...

    C# return 返回的几种用法

    C# return 返回的几种用法 return View(); 返回和控制器同名视图 return Content("我是一段文本", "text/html"); return Redirect("http://www.baidu.com/"); 返回URL重定向 还有好多种用法哦,下载了看吧。

    C# Iterative迭代用法示例

    在本示例中,我们将深入探讨C#中的迭代用法,特别关注`foreach`循环,这是在C#中进行迭代最常用的方法。 `foreach`循环用于遍历实现了`IEnumerable`接口的对象,这包括数组和各种集合类型。它的基本语法如下: ```...

    c#.net Bitmap类的基本使用方法

    本篇文章将详细介绍`Bitmap`类的基本使用方法,包括其构造函数、属性、方法以及如何与其他图形组件交互。 1. **Bitmap类的创建** - `Bitmap(int width, int height)`:创建一个指定宽度和高度的新空白位图。 - `...

    C#控件用法

    C#控件用法大全,包括各种窗体控件,数据控件。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    C#基本控件用法(winform,原创)

    C#基本控件用法(winform) C#中的控件用法是非常重要的,尤其是在winform应用程序中。今天,我们将来学习一些基本的控件用法,包括Button、CheckBox、ComboBox、DataGridView、ListView、TreeView和MdiForm等。 ...

    C# set get用法

    正确使用`set`和`get`方法可以显著提高代码的安全性、一致性和可维护性,是每个C#开发者应该熟练掌握的重要概念。 通过以上的分析,我们可以看出C#的`set`和`get`用法不仅仅是一种简单的数据访问机制,它们还提供了...

    C#中volatile与lock用法

    本文实例讲述了C#中volatile与lock用法,分享给大家供大家参考。具体分析如下: 一、C#中volatile volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问...

    C#的Demo项目:RabbitMQ封装和使用

    在标题和描述中提到的C# Demo项目,主要展示了RabbitMQ的基础用法,特别是如何封装RabbitMQ.Client库以简化操作,并演示了三种不同的Exchange(交换机)的使用。交换机是RabbitMQ中的核心组件,它决定了消息如何路由...

    C#语言语法 c#语言基本语法 c#所有基本用法

    泛型是C#中一个强大的特性,允许在定义类、接口和方法时使用类型参数,从而创建可以处理多种数据类型的通用代码。例如,List就是一个泛型类,T代表了存储的元素类型。泛型提高了代码的复用性和类型安全性。 C#还...

    C#常用工业控件及使用方法

    本篇文章将深入探讨C#中常见的工业控件及其使用方法。 一、模拟仪表控件 模拟仪表控件如指针式仪表盘,常用于显示实时数据,如温度、压力等。C#中可以使用第三方库如DevExpress或Telerik提供的控件来实现。设置模拟...

    c# socket 、TCPClient、TCPListener 用法详解.doc

    C# Socket、TCPClient、TCPListener 用法详解 C# 中的 Socket 编程是基于 Windows Sockets (Winsock) 接口的托管实现,提供了一个强大且灵活的网络编程模型。在本文中,我们将详细介绍 C# 中的 Socket 编程,包括 ...

    c# Picturebox控件的使用方法介绍

    c# picturebox使用方法 优化界面显示

Global site tag (gtag.js) - Google Analytics