C#密闭类

转载 2012年03月30日 09:54:53

C#提出了一个密封类(sealed class)的概念,帮助开发人员来解决这一问题。

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

sealed(C# 参考)

sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法但其本身不能在任何派生类中进一步重写当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。

在类声明中使用 sealed 修饰符可防止继承此类,例如:

sealed class SealedClass

{

public int x;

public int y;

}

将密封类用作基类或将 abstract  修饰符与密封类一起使用是错误的。

结构是隐式密封的;因此它们不能被继承。 

示例

// cs_sealed_keyword.cs

using System;

sealed class SealedClass

{

public int x;

public int y;

}

class MainClass

{

static void Main()

{

SealedClass sc = new SealedClass();

sc.x = 110;

sc.y = 150;

Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);

}

}

输出

x = 110, y = 150

在前面的示例中,如果试图通过使用下面的语句从密封类继承:

class MyDerivedC: MyClass {} // Error

将收到错误信息:

'MyDerivedC' cannot inherit from sealed class 'MyClass'.

密封类正好与抽象类相反。抽象类型必须被继承,不能为一个抽象类型创建一个实例。相反地,密封类型不能被继承,它是具体的。密封类不能被派生类型细化,它是类层次结构中的终结节点。

sealed修饰符也可以应用在实例方法、属性、事件和索引器上,但是不能应用于静态成员。密封成员可以存在于密封或非密封类中一 个密封成员必须对虚成员或隐含虚成员进行重写,如抽象成员。但是,密封成员自己是不能被重写的,因为它是密封的。sealed修饰符必须与 override修饰符结合使用。虽然密封成员不能被重写,但是一个在基类中的密封成员可以用new修饰符在派生类中进行隐藏。重要的是,CLR可以对密封成员进行优化。

以下代码展示了一个密封类和一个密封成员。在这个例子中,HourlyEmployee类不能被进一步地细化。此外,HourlyEmployee.Pay方法不能被重写。

public abstract class Employee {

    public virtual void Pay() {

    }

    public abstract void CalculatePay();

}

public sealed class HourlyEmployee: Employee {

    public sealed override void Pay() {

        CalculatePay();

    }

    public override void CalculatePay() {

    }

}

相关文章推荐

Visual Studio 为c#类变量定制颜色 + ReSharper 插件的使用

之前下了很多的 .vssettings 但是都不是很满意,主要还是因为 Xamarin Studio 版本的 Monokai 的配色实在是众多配色方案中,看着最舒服,最方便的。Visual Studi...
  • WPAPA
  • WPAPA
  • 2017年03月25日 01:04
  • 2144

C# System.Drawing.Region类的方法使用图解

本实例使用两个矩形A和B来演示System.Drawing.Region类的各方法的功能。绘制两个矩形获取目标矩形与此Region不相交的部分获取此Region与目标矩形不相交的部分获取两个矩形的交集...

C# 静态类(static class)等笔记

转载:http://blog.csdn.net/xiaobai1593/article/details/7278014 类可以声明为 static 的,以指示它仅包含静态成员。 静态类在加载包含该...

C#中ArrayList类的使用方法

ArrayList元素的添加 using System; using System.Collections.Generic; using System.Linq; using System...

(C#)一个最简单的链表类

转载自https://my.oschina.net/Tsybius2014/blog/277453 摘要: 一个最简单的链表类 一、关于C#链表 C#链表可用类LinkedList来存放。本文中的...

c# XML和实体类之间相互转换(序列化和反序列化)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I...
  • eit520
  • eit520
  • 2016年05月05日 22:59
  • 956

C# 泛型编程之泛型类、泛型方法、泛型约束

泛型方法     在C#2.0中,方法可以定义特定于其执行范围的泛型参数,如下所示:     public class MyClassT>     {         //指定My...
  • haukwong
  • haukwong
  • 2012年08月07日 17:36
  • 69906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#密闭类
举报原因:
原因补充:

(最多只允许输入30个字)