網上收集的這些,感覺還不錯 函數等集合在一個個的單元中(我們稱之為類)。被封裝的對象通常被稱為抽象數據類型。在本文中,我們將詳細學習屬性的特性。 封裝的概念 可以把程式按某種規則分成很多“塊“,塊與塊之間可能會有聯繫,每個塊都有一個可變部分和一個穩定的部分。我們需要把可變的部分和穩定的部分分離出來, ...
網上收集的這些,感覺還不錯
函數等集合在一個個的單元中(我們稱之為類)。被封裝的對象通常被稱為抽象數據類型。在本文中,我們將詳細學習屬性的特性。
封裝的概念
可以把程式按某種規則分成很多“塊“,塊與塊之間可能會有聯繫,每個塊都有一個可變部分和一個穩定的部分。我們需要把可變的部分和穩定的部分分離出來,將穩定的部分暴露給其他塊,而將可變的部分隱藏起來,以便於隨時可以讓它修改。這項工作就是封裝.
例如:在用類實現某個邏輯的時候,類就是以上所說的塊,實現功能的具體代碼就是可變的部分,而public的方法或者屬性則是穩定的部分。
封裝的意義
封裝的意義在於保護或者防止代碼(數據)被我們無意中破壞。在面向對象程式設計中數據被看作是一個中心的原素並且和使用它的函數結合的很密切,從而保護它不被其它的函數意外的修改。
封裝提供了一個有效的途徑來保護數據不被意外的破壞。相比我們將數據(用域來實現)在程式中定義為公用的(public)我們將它們(fields)定義為私有的(privat)在很多方面會更好。
私有的數據可以用兩種方式來間接的控制。下麵我們看一些c#例子來學習這兩種方法用以封裝數據。第一種方法,我們使用傳統的存、取方法。第二種方法我們用屬性(property)。無論我們使用哪種的方法,我們的目標是在使用數據的同時不能使它受到任何的破壞和改變。有如下好處
其一: 使用者只需要瞭解如何通過類的介面使用類,而不用關心類的內部數據結構和數據組織方法。
其二:高內聚,低耦合一直是我們所追求的,用好封裝恰恰可以減少耦合
其三:只要對外介面不改變,可以任意修改內部實現,這個可以很好的應對變化
其四:類具有了簡潔清晰的對外介面,降低了使用者的學習過程
用傳統的讀、寫方法封裝
讓我們來看一個例子有一個類Department,為了操縱這個類中的數據(string departname)我們定義了一個讀方法和一個寫方法。
using system;
public class Department
{
private string departname;
.......
// 讀方法
public string GetDepartname()
{
return departname;
}
//寫方法
public void SetDepartname( string a)
{
departname=a;
}
}
通過上面的方法,我們可以保護私有數據不被外部程式所破壞。
常用的是使用這個!!!!
c#使用屬性封裝
1、使用屬性封裝方法
2、AccessModifer Type PropertyName
{get{...}set{...}
}
public int {get{ return this.X}set{this.x=rangeCheckX(value)}
}
2、屬性對某個欄位封裝時,命名規則,首字母大寫
private int employeeID;public int EmployeeID
{get{return this.EmployeeID;};set{this.EmployeeID=value}
}
3、介面中定義屬性
interface IScreenPosition
{
int X{get;set;}
int Y{get;set;}
}
4、實例化同時賦值
static void DoWork()
{
Polygon square = new Polygon();
Polygon triangle = new Polygon { NumSides = 3 };
Polygon pentagon = new Polygon { SideLength = 15.5, NumSides = 5 };
Console.WriteLine("Square: number of sides is {0}, length of each side is {1}",
square.NumSides, square.SideLength);
Console.WriteLine("Triangle: number of sides is {0}, length of each side is {1}",
triangle.NumSides, triangle.SideLength);
Console.WriteLine("Pentagon: number of sides is {0}, length of each side is {1}",
pentagon.NumSides, pentagon.SideLength);
}
詳細請看它::::
c#中的屬性
在C#中我們可以很自由的訪問共有欄位,但有時我們可能需要某欄位只能讀或者寫,或在改變欄位值得時候做一些其他事情,顯然這些僅僅依靠欄位是無法實現的,於是便有了屬性。
1、基本用法
c#中的屬性由屬性作用域中定義的get作用域(訪問方法)和set作用域(訪問方法)構成。
class Test
{
private int number;
//int表示該屬性所封裝的數據類型
//數據類型必須與相應的欄位(number)相同
public int Num
{
get{return number;}
set{number=value;}
}
}
當封裝數據時,可能希望配置一個只讀屬性。為此,可以忽略set塊。類似,如果想擁有一個只讀屬性,就忽略get塊。
2、靜態屬性
C#靜態屬性可以是讀寫屬性,只讀屬性,只寫屬性中的任意一種。靜態訪問器適用於整個類,而不是類的實例。靜態屬性中的set,get訪問器只能訪問類的靜態成員。靜態屬性可以通過類名訪問,不能使用實例調用,這與靜態方法相同。
//簡單的儲蓄賬戶類
class SavingAccount
{
//實例級別的數據
public double currBalance;
//靜態數據點
private static double currInterestRate = 0.04;
//靜態屬性
public static double InterestRate
{
get{return currInterestRate;}
set{currInterestRate=value;}
}
}
3、自動屬性
自動屬性可以簡化封裝數據欄位的過程,減輕了定義私有返回欄位和相關c#屬性成員的工作。在定義自動屬性時,只指定訪問修飾符、實際的數據類型、屬性名稱和空的get/set作用域。在編譯時,編譯器為類型自動生成了私有返回欄位和適當的get/set實現邏輯。
class Enemy
{
//自動屬性
public string Name{get;set;}
public int Life{get;set;}
public float Attack{get;set;}
}
註意:與傳統的屬性不同的是,不允許構建只讀或只寫的自動屬性,自動屬性定義是必須同時支持讀寫功能。但是定義更嚴格的get或set是可以的
4、關於自動屬性和預設值
可以直接在代碼中使用封裝了數字或布爾數據的自動屬性,因為隱藏的返回欄位將設置一個可以直接使用的安全的預設值。但如果自動屬性封裝了另一個類變數,隱藏的私有引用類型的預設值將設為null。
例如下麵的類spawn,使用了兩個自動屬性
class Spawn
{
//隱藏的int欄位預設值為0
public int numbers{get;set;}
//隱藏的Enemy返回欄位為null
public Enemy MyEnemy{get;set;}
}
當直接調用MyEnemy時,將會在運行時得到空引用異常,因為沒有為後臺使用的Enemy成員變數設置新的對象。
由於私有的返回欄位是在編譯時創建的,所以不能直接使用new關鍵字直接分配引用類型,必須在類的構造函數內部執行,以確保對象以安全方式誕生。
class Spawn
{
//隱藏的int欄位預設值為0
public int numbers{get;set;}
//隱藏的Enemy返回欄位為null
public Enemy MyEnemy{get;set;}
//必須用構造函數重寫分配給隱藏返回欄位的預設值
public Spawn()
{
MyEnemy = new Enemy();
numbers = 1;
}
public Spawn(Enemy enemy, int num)
{
MyEnemy = enemy;
numbers = num;
}
}