1樓:
樓上的很長,不針對問題。我來答一下:
using system;
using system.collections.generic;
using system.text;
namespace test
public int divide(int num1, int num2)
public int yunsuan(int num1, int num2, call aa) }
class testdelegates
", result);
system.console.writeline("結果為 ", result1);
console.readline();
} }} 我把你的**做了一下修改,執行結果如下:
結果為 12
結果為 3
2樓:
我以前寫過一寫委託的意義和具體實現 委託這部分確實比較難 我把資料傳給你 希望對你學習有所幫助
1.委託delegate
委託實際上就是引用,用於引用函式,相當於c++種的函式指標,但是委託是型別安全的,委託定義了函式的全部細節--返回值型別 引數細節 委託實際上就是相應函式的** 雖然委託看起來是多此一舉 但是委託是型別安全的,委託可以呼叫任何跟委託關聯的方法,並且委託是事件的基礎,一個委託代表了一類方法 可擴充套件性大大增強
有了委託你就可以把方法看作像常數一樣,而委託就是該常數型別的變數.
從這個角度看來用於宣告事件的委託就是宣告這個事件觸發以後所呼叫的方法的標籤或者特徵.只有符合該標籤(引數個數和引數型別)的方法才可以做為該用於該事件的**.
一個事件觸發了,你可能需要用多個方法處理該事件或者說該事件呼叫了多個方法(每個事件的例項都有一個需要呼叫的方法列表,當事件觸發它會逐個呼叫列表中的每個方法)
通過使用委託你可以實現對一類方法的封裝.
打個比方:如果你騎自行車,你需要有騎自行車的方法drivebike().如果你騎摩托車你需要有騎摩托車的方法.
現在你有一個方法drivemoto.現在你需要定義一個方法,實現你騎(自行車或者摩托車)到某地driveto(地點,騎的方式)
騎的方式這裡其實就是委託.在使用的時候,如果你是騎自行車你就用drivebike例項化委託的例項帶入driveto方法,如果你騎摩托車你就用drivemoto例項化"騎的方式"這個委託帶入driveto方法.
多播委託
如果呼叫多播委託就可以按順連續序呼叫多個方法,為此多播委託的簽名就必須返回void,實際上如果編譯器發現摸個委託返回void就會自動假定這是一個多播委託,如果使用多播委託就應該注意同一個委託呼叫方法鏈的順序並未正式定義,因此應避免編寫以任意特定順序呼叫方法的**
匿名方法
在定義test時並不是傳遞了已知的方法名,而是使用了一個**塊
public delegate testdelegate (string s);
testdelegate test=delegate(string s)
2. 事件 event (observer觀察者設計模式)
observer設計模式中主要包括如下兩類物件:
subject:監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是一個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。
observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。
監視物件並不關心誰在監視它,當達到滿足條件後它會把事件廣播出去(onaction函式)廣播的內容包括誰觸發了事件和監視者所關心的一些資訊(this,e)在本例中觸發監視物件的是當水達到95度時候呼叫onaction函式,而監視者關心的資訊是溫度temperature
一個監視物件可以被很多觀察者所監視,這也是觀察者所不關心的,這種模式充分體現了delegate的優越性,由於被監視者不關心誰在監視它,所以只要滿足委託所定義的細節的函式都可以作為監視者觀察物件 假設沒有委託模式 監視物件必須在函式體內連線監視物件 在溫度達到標準後必須一一通知監視者 並且當監視者增加後 必須在監視物件類中重寫函式以增加監視物件的呼叫 這大大降低了函式的可擴充套件性
observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當一個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種鬆耦合的設計模式
net framework的編碼規範:
委託型別的名稱都應該以eventhandler結束。
委託的原型定義:有一個void返回值,並接受兩個輸入引數:一個object 型別,一個 eventargs型別(或繼承自eventargs)。
事件的命名為 委託去掉 eventhandler之後剩餘的部分。
繼承自eventargs的型別應該以eventargs結尾。
再做一下說明:
委託宣告原型中的object型別的引數代表了subject,也就是監視物件,在本例中是 heater(熱水器)。**函式(比如alarm的makealert)可以通過它訪問觸發事件的物件(heater)。
eventargs 物件包含了observer所感興趣的資料,在本例中是temperature。
上面這些其實不僅僅是為了編碼規範而已,這樣也使得程式有更大的靈活性。比如說,如果我們不光想獲得熱水器的溫度,還想在observer端(警報器或者顯示器)方法中獲得它的生產日期、型號、**,那麼委託和方法的宣告都會變得很麻煩,而如果我們將熱水器的引用傳給警報器的方法,就可以在方法中直接訪問熱水器了。
using system;
using system.collections.generic;
using system.text;
namespace delegate
}// 可以供繼承自 heater 的類重寫,以便繼承類拒絕其他物件對它的監視
protected virtual void onbolied(boliedeventargs e)//事件發生模型
}// 燒水。
public void boilwater()}}
}// 警報器(observer觀察著模型)
public class alarm
- : ", heater.area, heater.type);
console.writeline("alarm: 嘀嘀嘀,水已經 度了:", e.temperature);
console.writeline();}}
// 顯示器(observer觀察著模型)
public class display
- : ", heater.area, heater.type);
console.writeline("display:水快燒開了,當前溫度:度。", e.temperature);
console.writeline();}}
class program}}
3樓:
把你在main函式中的call換成delegates.call
同樣,把math換成delegates.math
4樓:手機使用者
註釋// call是自己定義的用於儲存結果資料集、返回值、傳出引數集的類
你應該自己建一個call類
C 中如何讀取中的座標資料,C 中如何讀取txt文件中的座標資料?
include include inline bool check double const x int main int const arc,char const arg std ifstream file arg 1 if file int num double x,y,z int cnt 0 ...
C中如何在類中呼叫另類中的資料,C 中 如何在一個類中 呼叫另一個類中的資料?
c 窗體間傳遞資料有好多種方法,說下個簡單的 在要呼叫的窗體中新增被呼叫窗體欄位,構造方法中傳入被呼叫的窗體做引數,將被呼叫窗體的需要被呼叫的資料的訪問修飾符設定為 public 將form1的 listbox 的訪問修飾符設定為 public這樣就可以通過欄位.屬性 呼叫被呼叫窗體的資料了 pub...
C語言的應用
1全部比如說做計算器,計算器介面是另外的 做的,你的 是在後臺執行,計算器介面顯示與你的演算法 通過介面進行互動,程式 的輸入輸出或接收的引數等就可以作為介面 如果一個按鈕的功能是求出平方根,那麼這個按鈕的功能函式就需要你寫出來,當點選這個按鈕時把介面上的數字通過介面傳遞進去,函式的運算結果也通過相...