密封類:
密封類是類的一種,用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呢?