C#速成(之五)全文完 (轉)
-------------------
委託
-------------------
委託讓我們把一個引用在一個變數裡。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
{
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
{
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:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-962047/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#速成(之四) (轉)C#
- C#速成(之一) (轉)C#
- C#速成(之二) (轉)C#
- C#速成(之三) (轉)C#
- (X)Emacs 速成(轉)Mac
- c#之轉義字元C#字元
- C#簡明教程(五)-資料型別 (轉)資料型別
- 轉:SAP專案管理系統速成專案管理
- 記憶體管理之五 (轉)記憶體
- 歪批IT之五:全套資訊孤島(轉)
- (INTERBASE之五) IB技術指標 (轉)指標
- 【轉載】C#之int與Java之Integer的區別C#Java
- C#搶鮮快報之FAQ20 (轉)C#
- 明日之後主題曲叫什麼 段奧娟明日之後的你歌詞全文完整版KC
- python速成Python
- React Native 速成 005 — React Navigation 之 Tab NavigatorReact NativeNavigation
- USB開發速成-我最真實的經驗!(轉)
- 《Mastering Delphi 6》學習筆記之五 (轉)AST筆記
- VC++ ADO開發實踐之五 (轉)C++
- C# 介面跳轉-登陸之後跳轉至主視窗C#
- RxJS速成 (上)JS
- RxJS速成 (下)JS
- MSDN 訪談錄之C#程式設計一 (轉)C#程式設計
- string和byte[]之間的轉換 (C#)C#
- [用設計模式鍛鍊C#系列]之Strategy (轉)設計模式C#
- [用設計模式鍛鍊C#系列]之Builder (轉)設計模式C#UI
- [用設計模式鍛鍊C#系列]之Decorator (轉)設計模式C#
- 設計模式之C#實現(一)--AbstractFactory(補) (轉)設計模式C#
- Hadoop(五)C#連線HiveHadoopC#Hive
- Data Guard broker系列之五:資料庫角色轉換資料庫
- ORACLE常用傻瓜問題1000問(之五)(轉)Oracle
- ORACLE常用傻瓜問題1000問(之五) (轉)Oracle
- C#之helloworldC#
- C#之介面C#
- c#之delegateC#
- c#之eventC#
- c#之structC#Struct
- Swift速成:捕獲列表Swift