A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 芦路 中级黑马   /  2013-10-27 20:25  /  1882 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 芦路 于 2013-10-28 10:37 编辑

密封类和密封方法有什么优点,怎么使用密封类和密封方法?

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

4 个回复

倒序浏览
C#中使用关键字sealed,将类和方法声明为密封类或者密封方法

密封方法:是为了防止方法在类的派生类中对该方法进行重载
不是类的每个成员都可以作为密封方法,密封方法必须对基类的虚方法进行重载。
所以,sealed总是与override修饰符同时使用。

密封类:不能作为基类被继承,但它可以继承别的类或借口
在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写
由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
密封类和密封方法

C#中使用关键字sealed,将类和方法声明为密封类或者密封方法
对于密封类来说,表示不能继承该类;对于密封方法来说,表示不能重写该方法
密封类不能作为基类被继承,但它可以继承别的类或借口
在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写
由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用

     public sealed class myClass     //声明密封类
     {
         public int = 0;
         public void method()
         {
             Console.WriteLine("密封类");
        }
    }
并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现并提供具体的实现,所以,声明密封方法时,sealed总是和override同时使用

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass2 test = new MyClass2();
            test.Method();
        }
    }

    public class MyClass1
    {
        public virtual void Method()
        {
            Console.WriteLine("基类中的虚方法");
            Console.ReadLine();
        }
    }

    public sealed class MyClass2:MyClass1
    {
        public sealed override void Method()
        {
            base.Method();
            Console.WriteLine("密封类中重写后的方法");
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
密封类
密封类可以用来限制扩展性,当在程序中密封了某个类时,其他类不能从该类继承,可防止对垒进行自定义。
定义密封类——sealed
sealed class MySealedClass
{

}
密封方法
下面的代码中用到了virtual(虚拟)修饰符
virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。 例如,此方法可被任何继承它的类重写。
默认情况下,方法是非虚拟的。 不能重写非虚方法。
virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
在静态属性上使用 virtual 修饰符是错误的。
通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
看示例:
namespace 密封方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Class2 myMethod = new Class2();
            myMethod.MyMethod();
            Console.ReadLine();
        }
    }
    class Class1
    {
        public Class1()
        {
            Console.WriteLine("创建Class1的类型变量");
        }
        public virtual void MyMethod()
        {
            Console.WriteLine("这是一个方法");
        }
    }
    class Class2 : Class1
    {
        public Class2()
        {
            Console.WriteLine("创建Class2的类型变量");
        }
        public sealed override void MyMethod()
        {
            Console.WriteLine("这是一个密封方法!");
        }
    }

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
黑马有你更精彩!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马