1 成員定義
這裏的成員包括字段,屬性,方法。字段類似於C++的成員變量;屬性是一個很獨特的成員,一般用於訪問私有字段;方法與C++的成員函數類似。成員都提供四種訪問 性。
pubilic--------------------成員可以由任何代碼訪問
private--------------------默認此關鍵字,成員只能由類中的代碼訪問
internal------------------成員由定義它的程序集(項目)內部的代碼使用.
protected---------------成員只能由類和派生類來訪問
protected internal----項目中的派生類使用
也可以使用static關鍵字來聲明字段,方法和屬性。
1.1 定義字段
(1)public int MyInt; 注意.NET Framework中的公共字段以PascalCasing形式來命名。私有字段使用camelCasing。
① 字段還可以使用readonly關鍵字,表示此字段只能在執行構造函數的過程中賦值,或者由初始化賦值語句賦值。
pubilic readonly int MyInt = 17;
② 可以用static關鍵字聲明爲靜態:public static int MyInt;
1,2 定義方法
與公共字段一樣,,NETFramework中的公共方法採用PascalCasing形式命名。
virtual------方法可以重寫
abstract----方法必須在非抽象類的派生類中重寫(只用於抽象類中)
override----方法重寫了一個基類
extern------方法定義在其他地方
如果使用了override,也可以使用sealed指定在派生類中不能對這個方法做進一步的修改,即這個方法不能由派生類重寫。
1.3 定義屬性
屬性定義方式與字段類似,但比字段的內容多。形式與方法類似,通過set塊,get塊來設置,修改屬性。
2 類成員的其他常用方法
2.1 隱藏基類方法
不同於C++的一點在於,一般在派生類中使用new關鍵字顯示錶明意圖。不管繼承的成員是否爲虛擬,都可以隱藏這些代碼。
new public void DoSomething() {};
這裏需要和之前的override區別來看。
對於:
MyDerivedClass myObj = new MyDerivedClass();
MyBaseClass myBase = myObj;
myObj.DoSomething();
myBase.DoSomething();
override中,基類必須是需要virtual聲明,重寫之後,不管是基類指針還是派生類指針調用都是override的方法。
public class MyBaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base");
}
}
public class MyDerivedClass : MyBaseClass
{
public override void DoSomething()
{
Console.WriteLine("Derived");
}
}
輸出:
Derived
Derived
new隱藏基類方法,不管基類是否virtual聲明,派生類new之後效果都一樣。派生類指針調用派生類方法,基類指針調用基類方法。
public class MyBaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base");
}
}
public class MyDerivedClass : MyBaseClass
{
new public void DoSomething()
{
Console.WriteLine("Derived");
}
}
輸出:
Derived
Base
2.2 base關鍵字
無論是重寫成員還是隱藏成員,都可以在派生類的內部訪問基類成員。使用base關鍵字,表示包含在派生類中的基類的實現代碼。
注:因爲base使用的是對象實例,所以在靜態成員中使用會出現錯誤。
2.3 this關鍵字
this也可以用在類成員的內部,只是this引用的是,當前對象的實例,即不能在靜態成員中使用this關鍵字。
3 接口的實現
接口成員的定義與類成員的定義相似,但有以下幾個區別:
(1)不允許使用訪問修飾符(public, private, protected, 或internal),所有接口成員都是公共的。
(2)接口成員不能包含代碼體。
(3)接口不能定義字段成員。
(4)接口成員不能使用static, virtual, abstract, 或 sealed來定義。
(5)類型定義成員是禁止的。
(6)要隱藏繼承了基接口的成員,可以用new關鍵字來定義它們
(7)在接口中定義的屬性可以定義訪問塊get和set中的哪一個能用於該屬性(或將它們同時用於該屬性)
interface ImyInterface
{
intMyInt { get; set;}
}
(8)接口與類一樣,可以定義爲類的成員。
3.1 在基類中把接口的方法定義爲虛擬的
在派生類中用new關鍵字隱藏一個基類成員,而不是重寫它,則方法ImyInterface.DoSomething()就總是引用基類版本,即使通過接口訪問派生類,也是這樣。
interface IMyInterface
{
void DoSomethingElse();
}
public class MyBaseClass : IMyInterface
{
public virtual void DoSomethingElse()
{
Console.WriteLine("BaseSomethingElse");
}
}
public class MyDerivedClass : MyBaseClass
{
new public void DoSomethingElse()
{
Console.WriteLine("DerivedSomethingElse");
}
}
則,使用下面的方法:
IMyInterface inter = new MyBaseClass();
inter.DoSomethingElse();
IMyInterface inter2 = new MyDerivedClass();
inter2.DoSomethingElse();
則,輸出:
BaseSomethingElse
BaseSomethingElse
而將派生類的方法定義爲:
public override void DoSomethingElse()
{
Console.WriteLine("DerivedSomethingElse");
}
之後,則輸出:
BaseSomethingElse
DerivedSomethingElse
3.2顯示定義接口
如果,由類顯示地實現接口成員,該成員就只能通過接口來訪問,不能通過類的訪問。
public class MyBaseClass : IMyInterface
{
void IMyInterface.DoSomething()
{
Console.WriteLine("xianshiBaseSomething");
}
}
3.3用非公共的可訪問性添加屬性存取器
如果在定義屬性的接口中只包含set塊,就可以給類中的屬性添加get塊,反之亦然。但是,只有所添加的存取器的可訪問修飾符比接口中定義的存取器的可訪問性更加嚴格時,才能這麼做。