密封类:
密封类是类的一种,用sealed修饰,不能用做基类。它也不能抽象类。密封类主要用于防止派生。ide
C#提出了一个密封类(sealed class)的概念,帮助开发人员来解决这一问题。函数
密封类在声明中使用sealed 修饰符,这样就能够防止该类被其它类继承。若是试图将一个密封类做为其它类的基类,C#将提示出错。理所固然,密封类不能同时又是抽象类,由于抽象老是但愿被继承的。测试
sealed(参考)优化
sealed 修饰符能够应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其自己不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override 一块儿使用。this
在类声明中使用 sealed 修饰符可防止继承此类,例如:url
sealed class SealedClasscode
{继承
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() { }
}
封装函数:
//只读封装
public class Department
{
private string department;
public Department(string str)//有参构造函数
{
department = str;
}
public string DepartmentName
{
get { return this.department; }
}
} public class Tester { static void Main(string[] args) { Department pm = new Department("myName"); Console.WriteLine("pm.DepartmentName is:{0}", pm.DepartmentName); Console.Read(); }问题:调用有参构造函数时应该是把字符串"naName"赋值给了私有字段department了吧?那为何
Console.WriteLine()内部要写pm.DepartmentName而不写department呢????
//2:只写封装
public class SetPart
{
private string setpart;
public string Setpartname
{
set
{
setpart = value;
Console.WriteLine("the Setpartname is:{0}",setpart);
Console.Read();
}
}
}
public class Tester
{
static void Main(string[] args)
{
SetPart s=new SetPart();
s.Setpartname= "my name";
} }//问题:这个测试函数部分是怎样的执行过程啊?语句s.Setpartname= "my name"就是给属性赋值吧?为何会执行了 Console.WriteLine()?并且内部为何不写s.Setpartname而写setpart呢?