趣味程式設計 將事件視為物件

2021-09-05 21:38:10 字數 1323 閱讀 1328

如果乙個語言(平台)把事件視為物件,則表明它把「事件」作為了語言的一等公民來對待。這意味著,我們可以把乙個單獨的事件作為引數傳遞給方法,也可以將其作為乙個物件的一部分,這有效地提高語言的抽象能力。試想,如果沒有「委託」,在.net中就無法把「方法」看作是物件,也就很難使用如今各種靈活的抽象方式。同樣,由於.net本身無法將事件作為單個物件處理,因此在某些時候就會束手束腳,也難以引入一些特別的程式設計模型。

這就是「把事件作為物件進行傳遞」的實際意義。

class 

program

}

看上去挺那麼像回事兒的,使用方式和傳統的事件似乎沒有太大區別。但是文末我提到這裡其實有些「糊弄」的意味,而我們的裝配腦袋同學、以及「腦袋裝配得不輸給裝配腦袋」的rednaxelafx,這兩位純爺們也都指出了問題。

信腦袋,得永生。信rednaxelafx,原地滿狀態復活。

以上**的「忽悠」,在於操作program.submit的**處於program類之內。如果我們想要使用相同的做法操作其他類的事件就做不到了,例如:

public class 

myclass

class

program

}

這樣的**看似沒有問題,但是編譯器會提示這樣的錯誤:

static void registerhandlers(ref 

eventhandler e)

然後:

static void main(string args)

不過很顯然,這樣的做法也會遇到相同的問題:除非是program內部的事件,我們不能把它像乙個委託物件那樣傳遞。而且,即使可以傳遞,我們也只能為它新增或刪除處理函式,而不能把它作為另乙個物件的一部分,然後經過各種處理之後,還可以對這個事件進行操作。

因此,我們要實現的其實是這樣乙個型別:

public class 

delegateevent

public

delegateevent

removehandler(tdelegate handler)

}

這就是今天「趣味程式設計」的題目:將delegateevent<>型別實現完整,並盡可能做到嚴謹和易用(即適用於各種場合,各種方式進行「構造」)。

所謂「趣味程式設計」,是指那些我覺得難度適中的小題目,並可以鍛鍊「程式設計能力」或「語言類庫的掌握程度」。一般來說它們都源自實際專案,只不過改造成「題目」時進行了「抽象」和「提煉」。個人認為它們還是挺適合作為平時的程式設計練習來使用的,感興趣的朋友們不妨一試。

至於題目是否真的有「趣味」……這個見仁見智吧。我想,要讓那些對於那些視程式設計如磨難的朋友們感到有趣,應該不比登天要容易一些。(答案)

趣味程式設計 螺旋列印

給定乙個自然數n,列印1 n之間所有的數,要求 按螺旋形狀順時針列印。以前看到過這道題,說的是從外向內螺旋列印,而前幾天又看到乙個變種,由內向外列印。比之前的稍微難一點,趁週末閒著沒事,總結一下。先上兩幅圖,大家看一下效果。這兩種輸出方法,其實大同小異,道理都差不多,會了一種,則另一種不難,先看從外...

趣味程式設計 過橋問題

過橋問題。有n n 2 個人在晚上需要從x地到達y地,中間要過一座橋,過橋需要手電筒 而他們只有1個手電筒 每次最多兩個人一起過橋 否則橋會垮 n個人的過橋時間依次存入陣列t n 中,分別為 t 0 t 1 t n 1 過橋的速度以慢的人為準!注意 手電筒不能丟過橋!問題是 程式設計求這n個人過橋所...

趣味程式設計題 猜算式

看下面的算式 x x 它表示 兩個兩位數相乘等於乙個兩位數乘以乙個三位數。如果沒有限定條件,這樣的例子很多。但目前的限定是 這9個方塊,表示1 9的9個數字,不包含0。該算式中1至9的每個數字出現且只出現一次!比如 46 x 79 23 x 158 54 x 69 27 x 138 54 x 93 ...