国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

.NET Delegates: A C# Bedtime Story中文版(上篇)轉

.NET Delegates: A C# Bedtime Story中文版(上篇)轉

更新時間:2022-05-13 文章作者:未知 信息來源:網絡 閱讀次數:

作者:Chris Sells
譯者:榮耀
【譯注:C#進階文章。Chris Sells是《ATL Internals》一書作者之一。譯文中所有程
序調試環境均為Microsoft Visual Studio.NET 7.0 Beta2和 Microsoft .NET Framewo
rk SDK Beta2。代碼就是文章,請仔細閱讀代碼J】
類型耦合
從前,在南方的一個異國他鄉,有一個叫peter的勤勞的工人。他對boss百依百順,但他
的boss卻是個卑鄙無信的小人,他堅持要求peter不斷匯報工作情況。由于peter不希望
被boss盯著干活,于是他向boss承諾隨時匯報工作進度。peter利用類型引用定期回調b
oss來實現這個承諾:
using System;//【譯注:譯者補充】
class Worker
{
 public void Advise(Boss boss)
{
_boss = boss;
}
 public void DoWork()
 {
Console.WriteLine("Worker: work started");
if( _boss != null ) _boss.WorkStarted();
Console.WriteLine("Worker: work progressing");
if( _boss != null ) _boss.WorkProgressing();
Console.WriteLine("Worker: work completed");
if( _boss != null )
 {
int grade = _boss.WorkCompleted();
Console.WriteLine("Worker grade = " + grade);
 }
 }
 private Boss _boss;
}
class Boss
{
 public void WorkStarted() { /*boss不關心. */ }
 public void WorkProgressing() { /*boss不關心. */ }
 public int WorkCompleted()
 {
Console.WriteLine("It's about time!");
 return 2; /* out of 10 */
 }
}
class Universe
{
 static void Main()
 {
 Worker peter = new Worker();
 Boss boss = new Boss();
peter.Advise(boss);
peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
 }
}
/*【譯注:以下是上段程序輸出結果:
Worker: work started
Worker: work progressing
Worker: work completed
It's about time!
Worker grade = 2
Main: worker completed work
】*/
接口
 現在,peter成了一個特殊人物,他不但能夠忍受卑鄙的boss,和universe也建立
了緊密的聯系。peter感到universe對他的工作進程同樣感興趣。不幸的是,除了保證b
oss能夠被通知外,如果不為universe添加一個特殊的通知方法和回調,peter無法向un
iverse通知其工作進程。Peter希望能從那些通知方法的實現中分離出潛在的通知約定,
為此,他決定將方法剝離到接口中:
using System; //【譯注:譯者補充】
interface IWorkerEvents //【譯注:這就是分離出來的接口】
{
 void WorkStarted();
 void WorkProgressing();
 int WorkCompleted();
}
class Worker
{
 public void Advise(IWorkerEvents events) //【譯注:現在傳遞的參數類型為
接口引用】
{
_events = events;
}
 public void DoWork()
 {
Console.WriteLine("Worker: work started");
if( _events != null ) _events.WorkStarted();
Console.WriteLine("Worker: work progressing");
if(_events != null ) _events.WorkProgressing();
Console.WriteLine("Worker: work completed");
if(_events != null )
 {
int grade = _events.WorkCompleted();
Console.WriteLine("Worker grade = " + grade);
 }
 }
 private IWorkerEvents _events;
}
class Boss : IWorkerEvents //【譯注:Boss實現該接口】
{
 public void WorkStarted(){ /*boss不關心. */ }
 public void WorkProgressing(){ /*boss不關心. */ }
 public int WorkCompleted()
 {
Console.WriteLine("It's about time!");
 return 3; /* out of 10 */
 }
}
class Universe
{
 static void Main()
 {
 Worker peter = new Worker();
 Boss boss = new Boss();
peter.Advise(boss); //【譯注:或peter.Advise((IWorkerEvents)boss);

peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
 }
}
/*【譯注:以下是上段程序輸出結果:
Worker: work started
Worker: work progressing
Worker: work completed
It's about time!
Worker grade = 3
Main: worker completed work
】*/
委托
 不幸的是,由于peter忙于通知boss實現這個接口,以至于沒有顧得上通知univer
se也實現該接口,但他知道不久就需如此,至少,他已經抽象了對boss的引用,因此,
別的實現了IworkerEvents接口的什么人都可以收到工作進度通知。【譯注:請參見上一
節代碼示例及譯注】
 然而,peter的boss依然極度不滿,“Peter!”boss咆哮者,“你為什么要通知我
什么時候開始工作、什么時候正在進行工作?我不關心這些事件,你不但強迫我實現這
些方法,你還浪費了你的寶貴的工作時間等我從事件中返回。當我實現的方法需占用很
長時間時,你等我的時間也要大大延長!你難道不能想想別的辦法不要老是來煩我嗎?

 此時,peter意識到盡管在很多情況下接口很有用,但在處理事件時,接口的粒度
還不夠精細。他還要能做到僅僅通知監聽者真正感興趣的事件。因此,peter決定把接口
里的方法肢解成若干個獨立的委托函數,每一個都好象是只有一個方法的小接口。
using System; //【譯注:譯者補充】
delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();
class Worker
{
 public void DoWork()
 {
Console.WriteLine("Worker: work started");
if( started != null ) started();
Console.WriteLine("Worker: work progressing");
if( progressing != null ) progressing();
Console.WriteLine("Worker: work completed");
if( completed != null )
 {
int grade = completed();
Console.WriteLine("Worker grade = " + grade);
 }
 }
 public WorkStarted started; //【譯注:這樣寫更規矩:public WorkStarted
started = null;】
 public WorkProgressing progressing; //【譯注:這樣寫更規矩:public Work
Progressing progressing = null;】
 public WorkCompleted completed; //【譯注:這樣寫更規矩:public WorkComp
leted completed = null;】
}
class Boss
{
 public int WorkCompleted()
 {
Console.WriteLine("Better...");
 return 4; /* out of 10 */
 }
}
class Universe
{
 static void Main()
 {
 Workerpeter = new Worker();
 Boss boss = new Boss();
peter.completed = new WorkCompleted(boss.WorkCompleted);
peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
 }
}
/*【譯注:以下是上段程序輸出結果:
Worker: work started
Worker: work progressing
Worker: work completed
Better...
Worker grade = 4
Main: worker completed work

*/
【譯注:對“但在處理事件時,接口的粒度還不夠精細”的理解可用下例說明,請仔細
觀察一下程序,思考一下這樣做的不利之處J
using System;
interface IWorkStartedEvent
{
 void WorkStarted();
}
interface IWorkProgressingEvent
{
 void WorkProgressing();
}
interface IWorkCompletedEvent
{
 int WorkCompleted();
}
class Worker
{
public void Advise(IWorkCompletedEvent AEvent)
{
_event = AEvent;
}
public void DoWork()
{
Console.WriteLine("Worker: work completed");
if(_event != null )
 {
int grade = _event.WorkCompleted();
Console.WriteLine("Worker grade = " + grade);
}
}
private IWorkCompletedEvent _event;
}
class Boss : IWorkCompletedEvent
{
public int WorkCompleted()
{
Console.WriteLine("Better...");
return 4; /* out of 10 */
}
}
class Universe
{
static void Main()
 {
 Worker peter = new Worker();
 Boss boss = new Boss();
peter.Advise(boss);
peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
 }
}
/*以下是上段程序輸出結果:
Worker: work completed
Better...
Worker grade = 4
Main: worker completed work
*/

靜態監聽者
 這就達到了不用boss不關心的事件去煩他的目標。但是,peter還是不能夠使univ
erse成為其監聽者。因為universe是一個全封閉的實體,所以將委托掛鉤在universe的
實例上不妥的(設想一下Universe的多個實例需要多少資源...)。peter意識到應將委
托掛鉤于universe的靜態成員上,因為委托也完全適應于靜態成員:
using System;
delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();
class Worker
{
 public void DoWork()
 {
Console.WriteLine("Worker: work started");
if( started != null ) started();
Console.WriteLine("Worker: work progressing");
if( progressing != null ) progressing();
Console.WriteLine("Worker: work completed");
if( completed != null )
 {
int grade = completed();
Console.WriteLine("Worker grade= " + grade);
 }
 }
 public WorkStarted started = null;
 public WorkProgressing progressing = null;
 public WorkCompleted completed = null;
}
class Boss
{
 public int WorkCompleted()
 {
Console.WriteLine("Better...");
 return 4; /* out of 10 */
 }
}
//【譯注:以上代碼為譯者補充】
class Universe
{
static void WorkerStartedWork()
{
Console.WriteLine("Universe notices worker starting work");
}
static int WorkerCompletedWork()
{
Console.WriteLine("Universe pleased with worker's work");
return 7;
}
static void Main()
{
Worker peter = new Worker();
Boss boss = new Boss();
peter.completed = new WorkCompleted(boss.WorkCompleted); //【譯注:×

peter.started = new WorkStarted(Universe.WorkerStartedWork);
peter.completed = new WorkCompleted(Universe.WorkerCompletedWork);//
【譯注:這一行代碼使得“×”那一行代碼白做了L】
peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
}
}
/*【譯注:以下是上段程序輸出結果:
Worker: work started
Universe notices worker starting work
Worker: work progressing
Worker: work completed
Universe pleased with worker's work
Worker grade = 7
Main: worker completed work
】*/
事件
 不幸的是,universe現在變得太忙并且不習慣于注意某一個人—universe用自己的
委托取代了peter的boss的委托,這顯然是將Worker類的委托字段設為public的意外的副
作用。【譯注:請參見上節例子代碼及譯注】同樣地,如果peter的boss不耐煩了,他自
己就可以觸發peter的委托(peter的boss可是有暴力傾向的)
// peter的boss自己動手了
if( peter.completed != null ) peter.completed();
peter希望確保不會發生這兩種情況。他意識到必須為每一個委托加入注冊和反注冊函數
,這樣監聽者就可以添加或移去它們,但誰都不能夠清空整個事件列表。peter自己沒去
實現這些方法,相反,他使用event關鍵字讓C#編譯器幫他達到這個目的:
class Worker
{
//...
public event WorkStarted started;
public event WorkProgressing progressing;
public event WorkCompleted completed;
}
 peter懂得關鍵字event使得委托具有這樣的特性:只允許C#客戶用+=或-=操作符添
加或移去它們自己,這樣就迫使boss和universe舉止文雅一些:
static void Main()
{
Worker peter = new Worker();
 Boss boss = new Boss();
 peter.completed += new WorkCompleted(boss.WorkCompleted);
 peter.started += new WorkStarted(Universe.WorkerStartedWork);
 peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);
peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
}
【譯注:以下是完整代碼:
using System;
delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();
class Worker
{
 public void DoWork()
 {
Console.WriteLine("Worker: work started");
if( started != null ) started();
Console.WriteLine("Worker: work progressing");
if( progressing != null ) progressing();
Console.WriteLine("Worker: work completed");
if( completed != null )
 {
int grade = completed();
Console.WriteLine("Worker grade = " + grade);
 }
 }
public event WorkStarted started ;
public event WorkProgressing progressing;
public event WorkCompleted completed;
}
class Boss
{
 public int WorkCompleted()
 {
Console.WriteLine("Better...");
 return 4; /* out of 10 */
 }
}
class Universe
{
 static void WorkerStartedWork()
 {
Console.WriteLine("Universe notices worker starting work");
 }
 static int WorkerCompletedWork()
 {
Console.WriteLine("Universe pleased with worker's work");
 return 7;
 }
 static void Main()
 {
 Worker peter = new Worker();
 Boss boss = new Boss();
peter.completed += new WorkCompleted(boss.WorkCompleted); //【譯注:
√】
peter.started += new WorkStarted(Universe.WorkerStartedWork);
peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);
peter.DoWork();
Console.WriteLine("Main: worker completed work");
Console.ReadLine();
 }
}
/*

以下是上段程序輸出結果:
Worker: work started
Universe notices worker starting work
Worker: work progressing
Worker: work completed
Better...// 【譯注:boss也通知到啦J“√”那一行代碼有用啦J,但是且慢,boss打
的那4分沒有得到,后面只得到了Universe給的7分L】
Universe pleased with worker's work
Worker grade = 7
Main: worker completed work
*/ <>

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        91网站在线观看视频| 欧美成人在线直播| 中文字幕一区二区三区色视频 | 日韩国产欧美视频| 亚洲黄色在线视频| 国产亚洲污的网站| 久久亚洲精华国产精华液| 色综合视频在线观看| eeuss影院一区二区三区| 国产伦精品一区二区三区在线观看| 亚洲激情综合网| 国产精品你懂的在线| 久久蜜桃一区二区| 26uuu亚洲| 日韩欧美三级在线| 欧美猛男gaygay网站| 欧美在线小视频| 欧美在线一区二区| 日韩一区二区免费在线电影 | 亚洲午夜电影网| 午夜精品一区二区三区免费视频| 亚洲黄色录像片| 亚洲成人激情综合网| 一区二区三区四区中文字幕| 亚洲你懂的在线视频| 一区二区视频免费在线观看| 午夜视频在线观看一区二区 | 久久久亚洲精品石原莉奈| 久久精品一区二区三区不卡牛牛| 国产情人综合久久777777| 欧美极品少妇xxxxⅹ高跟鞋| 日韩理论片网站| 蜜臀久久99精品久久久久久9| 日本三级韩国三级欧美三级| 精品在线播放免费| 99免费精品视频| 欧美伊人久久久久久久久影院| 欧美日韩日本视频| 26uuu国产日韩综合| 国产精品毛片无遮挡高清| 亚洲综合成人在线视频| 久久精品国产成人一区二区三区| 成人97人人超碰人人99| 欧美午夜宅男影院| 国产日韩欧美精品综合| 亚洲综合图片区| 国内外成人在线视频| 一本久久综合亚洲鲁鲁五月天| 337p亚洲精品色噜噜| 欧美国产精品一区| 日本女人一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 欧美日韩综合不卡| 亚洲国产成人在线| 蜜臀av一区二区| 91高清视频免费看| 国产校园另类小说区| 亚洲成人免费视| av不卡一区二区三区| 欧美一区二区视频免费观看| 国产精品毛片无遮挡高清| 麻豆传媒一区二区三区| 日本久久电影网| 欧美国产1区2区| 九色综合狠狠综合久久| 欧美日本国产视频| 一区二区三区欧美久久| 国产a精品视频| 日韩欧美国产一二三区| 亚洲午夜一二三区视频| 91片在线免费观看| 欧美国产一区在线| 国产精品主播直播| 精品国产一区二区三区不卡| 视频在线观看一区| 91行情网站电视在线观看高清版| 国产欧美1区2区3区| 黄色资源网久久资源365| 欧美一区二区三区不卡| 偷拍与自拍一区| 欧美网站一区二区| 樱花影视一区二区| 一本色道久久综合精品竹菊| 国产精品视频观看| 成人成人成人在线视频| 国产精品久久久久久久久图文区 | 欧美日韩午夜精品| 亚洲欧美日韩中文字幕一区二区三区 | 日韩视频一区二区在线观看| 亚洲综合色丁香婷婷六月图片| 成人免费视频视频| 一区视频在线播放| 99久久久久免费精品国产| 国产精品色婷婷久久58| 亚洲国产视频一区二区| 欧美午夜宅男影院| 婷婷综合在线观看| 欧美一区二区精品在线| 免费欧美在线视频| 日韩精品一区二区在线| 国产资源在线一区| 久久精品男人天堂av| 国产精品一区二区免费不卡| 国产午夜精品美女毛片视频| 国产成人精品三级麻豆| 中文字幕一区二区三区在线不卡| 99精品偷自拍| 亚洲国产精品一区二区久久 | 亚洲综合成人在线视频| 欧美日韩国产成人在线91| 人人超碰91尤物精品国产| 欧美大片国产精品| 成人av电影在线网| 午夜视频一区二区| 亚洲精品一区二区三区在线观看| 国产 欧美在线| 一区二区成人在线| 精品美女一区二区三区| 成人av小说网| 日日夜夜精品视频天天综合网| 精品精品国产高清a毛片牛牛| 成人动漫精品一区二区| 午夜免费久久看| 久久久99久久精品欧美| 色婷婷国产精品久久包臀| 天堂在线亚洲视频| 中文字幕国产一区| 欧美另类z0zxhd电影| 国产成人福利片| 尤物视频一区二区| 久久蜜臀中文字幕| 欧美图片一区二区三区| 国产在线精品不卡| 亚洲综合偷拍欧美一区色| 精品久久一区二区三区| 高清av一区二区| 亚洲综合无码一区二区| 久久久一区二区| 欧美日韩一二三区| 国产成人精品aa毛片| 天天综合天天做天天综合| 国产拍欧美日韩视频二区| 欧美日韩一区视频| 成人激情午夜影院| 久久国产视频网| 亚洲一区在线视频| 国产精品免费久久| 精品免费一区二区三区| 91国产免费观看| 99久久亚洲一区二区三区青草| 天天影视色香欲综合网老头| 国产精品久久久久一区二区三区共 | 欧美天堂一区二区三区| 丁香网亚洲国际| 久久精品国产第一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 欧美国产一区在线| 国产日韩欧美激情| 久久精品这里都是精品| 欧美白人最猛性xxxxx69交| 欧美日韩久久久一区| 91久久精品午夜一区二区| 成av人片一区二区| 成人一区在线看| 国产成人精品aa毛片| 国产精品一区二区男女羞羞无遮挡 | 99久久国产综合色|国产精品| 国产毛片精品视频| 国产很黄免费观看久久| 国产精品亚洲一区二区三区妖精| 久久99久久99小草精品免视看| 秋霞成人午夜伦在线观看| 丝袜亚洲精品中文字幕一区| 亚洲高清在线精品| 视频一区免费在线观看| 蜜桃av一区二区在线观看| 美日韩一区二区三区| 久久疯狂做爰流白浆xx| 精品一区二区日韩| 国产成人精品一区二区三区四区| 国产乱人伦精品一区二区在线观看| 久久99热99| 国产91精品一区二区麻豆网站| 国产99一区视频免费| 99久免费精品视频在线观看| 99久久精品国产麻豆演员表| 97久久精品人人澡人人爽| 99精品视频在线免费观看| 91在线观看美女| 欧美综合久久久| 欧美日本不卡视频| 精品99一区二区三区| 久久精品视频在线免费观看| 中文字幕不卡三区| 亚洲综合久久av| 日韩成人伦理电影在线观看| 免费在线观看一区二区三区| 国产老女人精品毛片久久| 不卡一卡二卡三乱码免费网站| 91麻豆产精品久久久久久 |