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