C#速成(之五)全文完 (轉)

worldblog發表於2007-08-16
C#速成(之五)全文完 (轉)[@more@]

-------------------

委託

-------------------

委託讓我們把一個引用在一個變數裡。C++當中,這類似於使用typedef定義的函式指標,我們通常用儲存一個函式指標。

:namespace prefix = o ns = "urn:schemas--com::office" />

宣告委託使用的關鍵字是 delegate。瞧瞧這個示例,你會理解什麼是委託:

示例:

delegate int Operation(int val1, int val2);

public int Add(int val1, int val2)

{

  return val1 + val2;

}

public int Subtract (int val1, int val2)

{

  return val1- val2;

}

public void Perform()

{

  Operation Oper;

  Console.WriteLine("Enter + or - ");

   string optor = Console.ReadLine();

  Console.WriteLine("Enter 2 operands");

  string opnd1 = Console.ReadLine();

  string opnd2 = Console.ReadLine();

  int val1 = Convert.ToInt32 (opnd1);

  int val2 = Convert.ToInt32 (opnd2);

  if (optor == "+")

  Oper = new Operation(Add);

  else

  Oper = new Operation(Subtract);

 

  Console.WriteLine(" Result = {0}", Oper(val1, val2));

}

-------------------

繼承和多型

-------------------

僅允許單繼承,多繼承要透過介面來實現。

示例:

class Parent{

}

class Child : Parent

-------------------

虛擬方法

-------------------

除了在子類中實現虛擬方法採用overr關鍵字外,虛擬方法實現多型的概念C#與C++相同。父類使用相同的virtual關鍵字。從過載虛擬方法的每個類都要使用override關鍵字。

class Shape

{

  public virtual void Draw()

  {

  Console.WriteLine("Shape.Draw")   ;

  }

}

class Rectangle : Shape

{

  public override void Draw()

  {

  Console.WriteLine("Rectangle.Draw");

  }

}

class Square : Rectangle

{

  public override void Draw()

  {

  Console.WriteLine("Square.Draw");

  }

}

class MainClass

{

  static void Main(string[] args)

  {

  Shape[] shp = new Shape[3];

  Rectangle rect = new Rectangle();

 

  shp[0] = new Shape();

  shp[1] = rect;

  shp[2] = new Square();

  shp[0].Draw();

  shp[1].Draw();

  shp[2].Draw();

  }

}

輸出t:

Shape.Draw

Rectangle.Draw

Square.Draw

-------------------

使用"new"來隱藏父方法

-------------------

你可以定義一個子類成一個新方法版本,隱藏基類當中的那個版本。使用new關鍵字就可以定義一個新版本。思考下面的示例,它是上面示例的修改後的版本。注意當我用Rectangle類中的new關鍵字代替override關鍵字時示例的輸出情況。

class Shape

{

  public virtual void Draw()

  {

  Console.WriteLine("Shape.Draw")  ;

  }

}

class Rectangle : Shape

{

  public new void Draw()

  {

  Console.WriteLine("Rectangle.Draw");

  }

}

class Square : Rectangle

{

  //沒在這裡讓你過載

  public new void Draw()

  {

  Console.WriteLine("Square.Draw");

  }

}

class MainClass

{

  static void Main(string[] args)

  {

  Console.WriteLine("Using Polymorphism:");

  Shape[] shp = new Shape[3];

  Rectangle rect = new Rectangle();

  shp[0] = new Shape();

  shp[1] = rect;

  shp[2] = new Square();

  shp[0].Draw();

  shp[1].Draw();

  shp[2].Draw();

  Console.WriteLine("Using without Polymorphism:");

  rect.Draw();

  Square sqr = new Square();

  sqr.Draw();

  }

}

輸出:

Using Polymorphism

Shape.Draw

Shape.Draw

Shape.Draw

Using without Polymorphism:

Rectangle.Draw

Square.Draw

這裡的多型性不會把Rectangle類的Draw方法當做Shape的Draw方法多型性的一種表現。相反,它會認為這是一種不同的方法。因此,為了避免父類與子類間的命名衝突,我們使用了new修飾符。

注意:你不能使用同一類下面一種方法的兩個版本,即一個是用new修飾符的版本,另一個是用override或virtual修飾符的版本。正象上面示例所說明的,我不能再在擁有virtual或override方法的Rectangle類中新增另一個命名為Draw的方法。同樣地,在Square類中,我也不能過載Square類的虛擬的Draw方法。

-------------------

基類成員

-------------------

如果子類與基類有同名的資料成員,為避免命名衝突,訪問基類資料成員和函要使用一個關鍵字base。在下面的示例中我們來看看如何呼叫基類的建構函式以及如何使用資料成員。

public Child(int val) :base(val)

{

  myVar = 5;

  base.myVar;

}

或者

public Child(int val)

{

  base(val);

  myVar = 5 ;

  base.myVar;

}

--------------------------------

將來的補充:

本文僅是一個C#語言的概覽,以便你能熟悉此語言的特點。雖然我已經盡力以簡明而全面的程式碼例示方式討論所有主要的C#概念,我認為要填加討論的還有很多。

將來我會加入更多還沒有討論的命令和概念,比如事件等等。我也想寫些有關C#初學者進行的東東。

參考資料:

our most commonly known MSDN

Inside C# by Tom Archer

A Programmer's Introduction to C# by Eric Gunnerson

Beginning C# by Karli Watson

Programming C# (O'Reilly)

About the Author

Aisha is a Master of Science in Computer Science from Quaid-i-Azam Univeristy. She has worked in VC++ 6, MFC, ATL, COM/DCOM, , C++, , and so forth. These days she is working on and C#. Inspired with nature, she loves to seek knowledge. She is also fond of travelling. She keeps a free code and articles site at

History

Date Posted: 2003" Day="13" Month="6">June 13, 2003


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-962047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章