密封類和封裝函數、可不同

密封類:
密封類是類的一種,用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呢?
相關文章
相關標籤/搜索