一、成員的定義
class Myclass { public int MyInt; }
可以使用readonly關鍵字,表示這個字段只能在執行構造函數的過程中賦值,或者由初始化語句賦值。
靜態成員之恩給你通過定義它的類來進行訪問(MyClass.MyInt)
2、定義方法
class Myclass { public int MyInt; public string GetString() { return "Here is a string!"; } }
private int myInt;
public int MyIntProp { get { return myInt; } set { } }
這樣的話,由於myInt這個字段是私有的,外部成員時不能訪問的,但是通過這個get和set就可以在外部修改了,但是前提是屬性是共有的。
set是一個賦值的功能,但是set可以通過一系列操作來達到不同途徑來設置方法。而且還可以這裡加上出錯的警告之類的。
然後就是get和set一樣也可以在前面加上一系列的限定關鍵字。例如
protected set { myInt = value; }
4、一個demo
創建一個MyClass.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Exercise { class MyClass { public readonly string Name; private int intVal; public int Val { get { return intVal; } set { if(value>=0&&value<=10) { intVal = value; } else { throw (new ArgumentOutOfRangeException("Val", value, "Val must be assigned a value between 0 and 10.")); } } } public override string ToString() { return "Name:" + Name + "\nVal:" + Val; } public MyClass(string newName) { Name = newName; intVal=0; } } }
在Main.cs中添加
#region Using directives using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; #endregion namespace Exercise { class Program { static void Main(string[] args) { Console.WriteLine("Creating object myObj..."); MyClass myobj = new MyClass("My Object"); Console.WriteLine("myObj created."); for(int i=-1;i<=0;i++) { try { Console.WriteLine("\nAttemp to assign {0} to myObj.val...", i); myobj.Val = i; Console.WriteLine("Value {0} assigned to myObj.Val.", myobj.Val); } catch(Exception e) { Console.WriteLine("Exception {0} thrown.", e.GetType().FullName); Console.WriteLine("Message:\n\"{0}\"", e.Message); } } Console.WriteLine("\nOutputting myobj.Tostring()..."); Console.WriteLine(myobj.ToString()); Console.WriteLine("myobj.ToString() Output."); Console.ReadKey(); } } }
二、類的高級議題
1、隱藏基類方法
(1)當從基類中繼承一個非抽象的成員的時候,也就繼承了其實現代碼。如果繼承的成員時虛擬的,就可以用override重寫這段代碼。無論繼承的成員是不是虛擬的,都可以隱藏基類的代碼。
public class MyBaseClass { public void DoSometing() { //Base implementation } } public class MyDeriveClass:MyBaseClass { public void DoSometing() { //Derived class implementation, hides base implementation } }
盡管這段代碼正常運行,但是還是會有一個waring,可以提醒我們是否有意隱藏這個成員。如果確實要隱藏這個成員,我們可以使用關鍵字new顯式地表明意圖。
public class MyDeriveClass:MyBaseClass { new public void DoSometing() { //Derived class implementation, hides base implementation } }
(2)如果重寫基類中的方法,派生類中的基類方法會被取代,即使是通過基類類型進行的,情況也是相同的。
public class MyBaseClass { public virtual void DoSometing() { Console.WriteLine("FUCK"); //Base implementation } } public class MyDeriveClass:MyBaseClass { public override void DoSometing() { Console.WriteLine("FUCK you!"); //Derived class implementation, hides base implementation } }
MyDeriveClass myObj = new MyDerivedClass(); MyBaseClass myBaseObj; myBaseObj = myObj; myBaseObj.DoSomething();
明顯,運算結果是FUCK you!
(3)還有就是可以使用隱藏基類的方法實現復寫所能實現的功能。
2、調用重寫或隱藏的基類方法
(1)重要性:
a、要對派生類的用戶隱藏繼承的公共成員,但仍能在類中訪問其功能。
b、要給繼承的虛擬成員添加實現代碼,而不是地重寫的新執行代碼替換它。
(2)base關鍵字
使用base關鍵字可以使用基類中的隱藏的相應的方法。
base.DoSomething();
(3)this關鍵字
a、可以在類內部使用,引用對象的實例。
b、把當前對象實例的引用傳遞給一個方法。
c、限定本地類型的成員。
return this.someData
3、嵌套的類型定義
class MyClass { public class myNestClass { public int nestedFlassField; } }
如果內部定義的類是共有的,那麼就可以在外部使用,但是要加上限定名稱,例如
MyClass.myNestedClass myobj = new MyClass..myNestedClass();
如果嵌套的類聲明為私有,或者聲明為其他與執行該實例化的代碼不兼容的訪問級別就不能在外部訪問。