C#入門之定義類成員與接口實(shí)現(xiàn)
一、類成員的訪問級(jí)別
- public:可由任何代碼訪問。
- private(默認(rèn)):只能由類中的代碼訪問。
- internal:只能由它所在的項(xiàng)目(程序集)內(nèi)部代碼訪問。
- protected:只能由類和其派生類訪問。
- protected internal:只能由它所在的項(xiàng)目(程序集)或派生類的代碼訪問。
二、定義字段
class MyClass { public int MyInt;//公共字段 int myInt;//私有字段 public readonly int MyInt2 = 17;//只讀成員,只能在聲明時(shí)賦值或在構(gòu)造函數(shù)中賦值。 public static int myInt3;//靜態(tài)字段,通過類訪問。作用:1、記錄一實(shí)例化對(duì)象的個(gè)數(shù),2、存儲(chǔ)必須在所有實(shí)例間共享的值。 public const float PI = 3.14F;//常量,編譯時(shí)就固定,一旦發(fā)生更改,需要重新編譯,必須且只有在聲明時(shí)初始化。 }
三、定義方法
方法的繼承修飾符:
- virtual:方法可以重寫。
- abstract:方法必須重寫,只用于抽象類。
- override:重寫一個(gè)基類方法??梢院蛃ealed一起使用,應(yīng)用在方法或?qū)傩裕硎静荒苓M(jìn)一步的重寫了。
- extern:代碼放于項(xiàng)目外,僅用于靜態(tài)[DllImport]表示的方法。
- static:方法只能通過類訪問。靜態(tài)方法和屬性不能訪問其基類的非靜態(tài)成員,不能訪問任何對(duì)象的實(shí)例變量。靜態(tài)成員可繼承。
- new :隱藏基類成員。
void Main() { A b1 = new B();//多態(tài) b1.M();//BM B b2 = new B(); b2.M();//BM } abstract class A { public virtual void M()//虛擬方法,可繼承 { Console.Write("AM"); } } class B : A { public override void M()// 重寫了基類方法M { Console.Write("BM"); } }
無論基類是否為虛擬,派生類都可以用new 來隱藏。不覆蓋基類方法,不影響基類的方法??梢杂胋ase.M()方式訪問基類成員。
void Main() { A b1 = new B(); b1.M();//AM B b2 = new B(); b2.M();//BM } abstract class A { public virtual void M()//虛擬方法,可繼承 { Console.Write("AM"); } } class B : A { public new void M()// 重寫了基類方法M { Console.Write("BM"); } }
四、定義屬性
屬性的繼承修飾符:virtual,abstract,override.
- 只讀屬性:不頂用其中的get、set方即可。
- 只寫屬性:用private修飾符對(duì)get、set方法進(jìn)行保護(hù)。
public class A { private int intVal; public int Val { get { return intVal; } set { if (value >= 0 && value <= 10) intVla = value; else throw new Exception("XX"); } } }
五、接口實(shí)現(xiàn)
實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)所有接口成員,且匹配指定的簽名。接口成員默認(rèn)是公共的。
若要實(shí)現(xiàn)接口成員,類中對(duì)應(yīng)的成員必須是公共的,非靜態(tài)的,并且與接口成員集郵相同的名稱和簽名。
interface IMyInterface //定義接口 { int DoSth();//定義方法 int IMyInt { set; get; }//定義屬性 event EventHandler Event;//定義事件 string this[int index] { get; set; } //定義索引器 } class MyClass : IMyInterface { private int _x; int IMyInterface.DoSth() //顯示接口實(shí)現(xiàn) { return _x; } public int IMyInt//隱式接口實(shí)現(xiàn) { get { return _x; } set { _x = value; } } public event EventHandler Event; protected void onEvent() { if (Event == null) { Event(this, EventArgs.Empty); } } public string this[int index] { get { return _x.ToString(); } set { _x = int.Parse(value); } } }
1、顯示接口實(shí)現(xiàn),只能通過接口訪問:
MyInterface myClass=new MyClass(); myClass.DoSth();
2、隱式接口實(shí)現(xiàn),既可通過類,也可通過接口訪問。
MyClass myClass=new MyClass(); myClass.DoSth();
六、定義索引器
索引器indexer是一種特殊類型的屬性。添加到類中,以提供類似于數(shù)組的訪問。
void Main() { MyClass myClass = new MyClass(); myClass[0] = "d"; Console.Write(myClass[0]);//d Console.Write(myClass[2]);//c } public class MyClass { private string[] arr = { "a", "b", "c" }; public string this[int index] { get { return arr[index]; }//只有g(shù)et,無set的索引為只讀索引 set { arr[index] = value; } } }
七、運(yùn)算符重載
void Main() { MyClass myClass1 = new MyClass(500); MyClass myClass2 = new MyClass(200); Console.Write(myClass1 - myClass2);//300 } public class MyClass { decimal weight; public MyClass(decimal weight) { this.weight = weight; } public static decimal operator -(MyClass a, MyClass b) { return a.weight - b.weight; } }
八、定義事件
void Main() { MyClass myClass1 = new MyClass(); myClass1.myEvent += (sender, args) => { Console.Write(sender); }; myClass1.TriggerEvent();//MyClass } public class MyClass { public event EventHandler<EventArgs> myEvent;//定義事件 public void TriggerEvent() { EventHandler<EventArgs> temp = myEvent; if (temp != null) temp(this, EventArgs.Empty);//觸發(fā)事件 } }
到此這篇關(guān)于C#入門之定義類成員與接口實(shí)現(xiàn)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中的隊(duì)列Queue<T>與堆棧Stack<T>
這篇文章介紹了C#中的隊(duì)列Queue<T>與堆棧Stack<T>,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05實(shí)例詳解C#實(shí)現(xiàn)http不同方法的請(qǐng)求
本篇文章給大家分享了C#實(shí)現(xiàn)http不同方法的請(qǐng)求的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,有需要的朋友參考下。2018-07-07C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲
這篇文章主要介紹了C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲的相關(guān)代碼,有想學(xué)習(xí)C#多線程編程的小伙伴可以參考下2016-09-09C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法,可實(shí)現(xiàn)將bmp格式位圖轉(zhuǎn)換成ico格式圖標(biāo)的功能,需要的朋友可以參考下2015-06-06DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯
這篇文章主要介紹了DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯,需要的朋友可以參考下2014-08-08Unity3D基于OnGUI實(shí)時(shí)顯示FPS
這篇文章主要介紹了Unity3D基于OnGUI實(shí)時(shí)顯示FPS,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11C#實(shí)現(xiàn)對(duì)數(shù)組進(jìn)行隨機(jī)排序類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)對(duì)數(shù)組進(jìn)行隨機(jī)排序類,實(shí)例分析了C#數(shù)組與隨機(jī)數(shù)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03