• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            ::^喬喬^::明鏡臺::原創空間::C#.NET2.0,C++技術BLOG
            人最重要的是心境,一顆平靜安穩的心才能更好的進步,保持自己的心態.成為夢想中的高手QQ群:8664695
            posts - 17,comments - 32,trackbacks - 0

            開源博客OXITE,這個博客系統是使用ASP.NET MVC來實現,最新版本的是2009215發布的。MVC并不是什么新東西,我研究OXITE主要的目的其實就是為了學習MVC而已。所以我們從結構上去分析這個東西,因為一次寫分析類的文章,可能寫的并不好。看到說得不準確的歡迎指出,一起進步嘛。

             

            一、什么是Oxite;

             

            Oxite是微軟發布的開源博客平臺。

            Oxite平臺使用微軟公共許可(Microsoft Public License)授權方式,這是微軟經過開放源代碼促進會(OIS)認證的開源許可之一。

            微軟稱,Oxite是一種具有可拓展性的、標準兼容的內容管理系統,旨在支持博客或更大型的網 站,能支持廣播、引用通告、匿名或驗證評論、個人全球統一標識(Gravatar)頭像及在任何頁面級別輸出RSS Feed等功能。用戶可在某一站點上創建和編輯一整套頁面,并可在頁面中定制HTML代碼,而且還可在單個站點上創建多個博客。

            微軟稱,開發Oxite平臺的最初目的就是向開發者展示ASP.Net MVC的功能。
            微軟使用Oxite創建了Mix Online網站,并向開發者提供了該站點的源代碼以供學習。Mix Online是一個網絡社區,其中心內容是微軟的Mix網絡開發者會議。

            微軟Oxite項目負責人埃里克·波特爾(Erik Porter)稱,Oxite并非現有的、已經確立的博客系統的直接競爭者,也無意挑戰微軟自身的SharePoint工具,后者也帶有內容管理系統的功能。他表示,Oxite平臺目前的對象僅為開發者,但最終可能適用于全體公眾。

            埃里克·波特爾(Erik Porter)在一個Oxite論壇上寫道:我們對Oxite平臺沒有任何其他計劃,只是希望為開發者提供一個能運行任何站點的范本。也就是說,到目前為止它只是一個社區項目,但如果社區決定要把它帶往其他方向,我們也不會加以阻止。

             

            二、我為什么選擇Oxite

                對于Oxite其實我只是在無聊的時候想找下相關MVC開發的現成項目。所以就進行了一番研究,我覺得這個系統十分適合初學者,如果你覺得不能理解面向對象,可以認真看一下這個Oxite,它充分的現實出面向對象建模的思想,在學校學習的時候我們老師總會用車,人之類的來描述面向對象,而我們在網上看到的大部分代碼,真正用到面向對象思想的其實不多。甚至可以說是教程式的。完全不能體現出面向對象的精髓。Oxite是輕量級的,它并不像petshop那個巨型和復雜。可能你第一打開代碼的時候會被他的類庫項目嚇著。。當你靜下心來的時候。你會發現,這個是一個很好的學習型作品。

            三、所需環境

            1.         Visual Studio 2008 SP1

            2.         ASP.Net MVC 1.0

            3.         xunit-1.5

            4.         AntiXssLibraryV1.5Installer.msi

            5.         Enterprise Library 4.1 - October 2008.msi

            6.         Microsoft SQL Server 2005

            7.         BlogML 2.zip

             

            以上是我使用的版本,這些版本能讓整個項目跑起來。頁面很簡單,也很簡潔,因為這個項目目前只是一個顯示技術的作用的項目。

            四、項目結構

            Oxite解決方案由5個項目組成:

            1.         Oxite (核心基礎項目)

            2.         Oxite.LinqToSqlDataProvider;(數據基礎項目依賴于Oxite

            3.         Oxite.Mvc;(相當于MVC中的C層,Controllers層的作用,依賴于Oxite

            4.         Oxite.Mvc.Tests;(測試層)

            5.         OxiteSite;(顯示層)

            M其實就是1,2C3,V5

             

            相信看到這里大家都可以看到已經基本可以運行期這個系統了。下一章,我將會是解析數據庫

            posted @ 2009-07-22 08:39 ^喬喬^ 閱讀(3079) | 評論 (1)編輯 收藏
            如何學習編程 

            大家第一次接觸編程的時候我想很多人都會在那些Q群啊之類的地方不斷的問,怎么學習編程,要看些那些書。甚至在百度,谷歌里搜索如何學習編程。

                這篇文章,我會從我自己學習編程的角度去描述,如何學習,可能不是最好的學習方法,但是我想對于一些朋友總會有幫助的,因為方法是源自你個人。我在這里說一下我的格言:別去想別人怎么做,首先應該想自己怎么做。別去想別人怎么幫助你。首先想自己幫助自己。

                想想我自己學習編程也有好多年啦。初三開始小打小鬧的用C語言寫個無聊的printf()到用HTML寫幾個個人網站。雖然沒啥技術含量不過都是自己的勞動,那時候真的很激動,現在回想起來,其實那時候很幼稚。不過也造就了我的興趣吧!好了閑話就少說了,我們入正題。

             

            在學習之前,請允許自己先問下自己:我為什么要做這樣的事。對于編程,我會先問一下,你為什么要學習編程?你會怎么回答?

             

            A:興趣;

            B:讀書需要;

            C:傳聞是高薪職業;

            D:容易就業;

            E:被逼的;

            F:無聊學學;

             

            這個你會怎么選擇;什么樣的目的,得到什么樣的結果。如果你選擇(A)我會開心,興趣就是動力,就算沒有人教,你也會鼓足勇氣去學習,就我個人來說,我是那種屁股坐不穩的人,你叫我坐在那里什么都不做半個小時,我會全身都不舒服的。但是一說到計算機,編程我可以一坐就是78個小時自己還沒感覺。興趣第一,很好,你以這個為目的我相信你一定能學好。相信你也有自己的一套學習方式。

            如果你選擇的是B:那么你也有一定的成功幾率,首先你要是一個會讀書的人,可以說讀書就是你的興趣,那么你也可以學好。當然如果只是隨潮流大家都讀所以我也要讀,那么你只能學不好了。

            如果你選擇的是C:那么你還是早點放棄吧,那些擁有高薪的都是十分牛的人,其實的廣大程序員還是掙扎在生活的水平線上。混飯吃而已,所以如果你抱著高薪去學習編程,你一定肯痛苦。這類也是最能有成就的一類,編程是技術需要的是一份執著,但是你的執著只是金錢。技術現在并不等于金錢。。。。

            如果你選擇的是D:我還是勸你早點放棄,現在的就業也不樂觀啊,失業大軍里計算機就占了很大的一部分比重,你隨時都可能是其中的一分子。

            如果你選擇的是E:很好,你也有可能學好,前提是逼你的人能一直強逼你下去,讓你進步,一句非常經典的話:“人都是被逼出來的。。。。。”。你出生的時候的確是被逼出來的,被你媽媽逼出來,呵呵!

            如果你選擇的是F:也不錯,起碼你無聊的時候想到的居然是編程,證明編程還能給你帶來樂趣。

             

            既然你已經知道為什么學習編程,那么我們要做的就是怎么去學習了。現在的編程語言很多,上百個語言,但是無論什么語言,都會有共同性的。所以你要學習編程那么就要先學習編程的思想,這個編程的思想你也只能看一下而已。了解一下計算機如何去讀這些編程語言這個很重要。不了解過個你學習任何編程語言都很難做到靈活運用。

            你明白了計算機是如何讀編程語言是的這個時候你就可以開始選擇你學習的語言了。至少這些編程語言都是我能看懂的,可以說是自己學過的。也會解析一下學習這些語言的一些特點。

            A: c#.NET

            B: Java

            C: C/C++

            D: PHP

            E: JavaScript

            F: lua

             

            我只列出了五種,其實還有更多的語言,有興趣可以自己去找下這些語言的特色.其實我了出的這些都有一個特色.都是跟C語言有一定的相似的.

            A: C#這個語言是微軟推出的,目前大部分應用都是應用在WIN平臺上,雖然LINUX也能用,但支持還不是太好.編程風格上我覺得是最優美.至少看起來很舒適,強大的智能感知.編程的學習難度分級是:初學偏易,一般編程中等,高級編程難。梯度不算陡峭。雖然是面向對象,但是現在大部分的人都很用到面向對象至少我在國內反編譯很多的應用系統的時候很多都沒有用到編程思想的,雖多就是把類用來實現腳本編程閉包功能而已。真正使用到面向對象的繼承多態的并不多。當然也有很多是使用了面向對象思想的,所以我覺得初學C#的時候完全可以放棄對象的繼承,多態這類比較復雜的東西。專心學習他的語法糖,還有封裝好的API,其實C#這個語言已經有個很完善的API基本上的應用都可以直接使用API來實現,而且從算法構造上也不算復雜。再加上IDE的智能感知,新手只需要了解各個命名空間的作用就可以了,智能感知會幫助我們完成API的調用(至少你要知道那些方法在那個空間,怎么用)。所以初學我把它定義在上手“易”。現在的學習其實并非一定要從記事本開始。學會使用IDE學習其實也是一項技能。編程很重要的一點。就是你動了多少手,你就收獲了多少,無論你看了多少別人的代碼,如果你不自己動手去寫一下,你永遠沒辦法感受到內涵,之前我有部分同學,他們跟我說,現在網上大把代碼,那里需要自己敲得那么辛苦干嘛上網COPY一下就什么都有了,傻瓜才自己手寫。好吧我承認我傻瓜。但是自少我現在的水平我敢說,,你只需要給我2樣東西我一樣能寫出你上網找的那些代碼。一樣是VS,另一樣是幫助文檔。說起這個事又令我想起最近公司招聘的一些趣事。最近公司面試了接近80個人吧,因為我們公司的上機考試是不允許上網的。呵呵!你們可以想象一下,不能上網后只有30個能勉強敲的出代碼的。能做出題目的更是少得可憐。突然我就想,這些人到底有沒基礎的,一個簡單的登錄功能和上傳文件功能不能上網就不會寫,我真是狂汗。。。一些號稱三年五年工作經驗的,居然還寫不出一個簡單的交叉表查詢。(其實就10句代碼。。。。)。所以啊過分依靠網絡怎么可能有自己的技術積累呢,這些人在我眼里三年五年也成不了構架師。。可能十年也去不到構架師的水平。

            BJAVA C#類似,傳聞微軟推出C#也是為了對抗JAVA而搞出來的。這兩種語言有很多相似的地方什么是命名的方式上都有很多相似的地方,JAVA也是從C語言里發展起來的。不過我覺得在學習曲線上,初學要比C#難,中國人普遍英語不太好。而且在IDE上微軟的VS要比JAVA的各類編輯器要優勝,主要是在智能感知上,還有一些輔助上。可能很多JAVA的鐵桿FANS會給我丟西瓜,丟雞蛋了。但我敢說,我說的是事實,JAVA位置一個環境都很辛苦,至少我學習的時候是這樣。免費啊,JAVA很多東西都是免費的,微軟要收費的,收費肯定好了。。。。我會偷偷的笑。。。你丫就不用盜版?有了光榮的盜版。收費問題根本就不是問題,再說從學習的角度。。盜版這些東西根本就無關痛癢的。。反而更容易召集人氣。。。

             

            C: C語言可以說是非常牛逼的語言,長期位居第一。但是需要投入的精力也不少啊,智能感知一直進步不大,可能是因為萬惡的宏定義呵呵(這個萬惡可不是我說的。)當然學習C語言如果你不懂使用宏定義那么你肯定沒學過C語言,C語言的宏定義雖然一直在C語言的書本上很少描述但是實際應用卻是不可缺少的,我看過IDSOFTDOOM的源代碼里簡直就是神一般。但是看起來也真是辛苦。題外話,其實上面很多語言都是根據C語言衍生出來的,什么很多特性都是參照了C語言。用很玄幻的說話。C語言是遠古時代遺留的強大魔法。既然是遠古學習曲線自然就陡峭得可以,我個人感覺我的C語言水平其實都只是菜鳥而已。C++一樣是菜鳥。C++C其實我覺得是2個語言根本不能混為一談的,但是很多招聘之的都把C/C++歸為一類,所以我也把它歸為一類,很多人想問學C++是不是要先學C。而且C++的分支多得嚇人。內涵也豐富得嚇人。。C語言個人技術化,我個人覺得C/C++起碼要4年才算出師,JAVA2年,C#都是2年。而且還需要一系列的計算機基礎,算法基礎等一些東西。而JAVAC#都把這些東西封裝了成標準的API了,我們只需要使用。但是C/C++這些東西都沒有一個確定的標準例如界面庫,有人用QT有人用MFC。這些都是不一樣的所以選擇的路也多,學的東西自然也更多了。但從編程上,并非就是C++的就比用C#的牛。C++只是擁有深厚的歷史,有自己獨特的文明。是因為它的文明而牛。

            DPHP 接觸不深,但是我覺得它是一個制作網頁的好語言,其他領域我并不怎么看好他,我覺得PHP在開發網頁上有很大的優勢,但是開發B/S級系統應用就現得比較力不從心了。所以如果你定位自己作為一個網頁開發人員的話,你就應該學習這種語言。如果是B/S級的應用的話,就應該使用C#或者JAVA,或者其他的語言。

            EJavaScript,非常有名的腳本語言,如果你想從事B/S的開發,網頁開發,你就一定要學這個,是一個必須掌握的技能。學習曲線相對比較平坦,而且內容也不算多,但是應用卻十分靈活的語言。強烈推薦初學者先學習這個語言,來尋找感覺,因為這個語言完全不存在編程環境的問題,你只需要有瀏覽器,記事本,兩樣任何系統都有的軟件就可以編寫它。所以我覺得首先學習它會對你理解編程思想有一定幫助。

            FLUA這個也是一個腳本語言,成就這個語言的名聲是來自一個叫“魔獸世界”的游戲,目前我了解LUA應用的領域比較多都是作為一種嵌入語言,嵌入到C或者C++中去使用,在國內很多游戲公司都會有LUA程序員,部分會由C語言程序員去兼任。因為LUA在語法上和C有很相似的地方,基本對舊的C語言程序員學習LUA是無難度的。當然也有它的局限性,作為腳本語言它本身就存在不足,而且這個語言本身就是作為C語言的擴展來用的所以,學習這個語言的話,建議先學習C語言。或者成就更高(或者而已!)

             

            我個人是選擇C#作為長期發展的語言的。我覺得這個語言比較適合我這種英語不算好,但是又喜歡編程的人。

             

            PS:真心想學編程的必須要學習一定的英語能力,因為很多編程的先進思想都是英文的。所以英語好,對成為高手起很大作用的。

             

            知道為什么學習編程,又選擇了目標語言,接下來就是基礎學習了。

             

            這個基礎學習,我覺得首先要對一些語法糖熟悉,第二件事情就是要多編,多看,可能你買的書都附帶著實例代碼的,我覺得對于初學者,首先你把書上的程序都照著編一次,在這期間,你一定會遇到無數的錯誤,但是這些錯誤將會是重復出現的,這個時候你就學會了如何排錯,有人說過編程不是一口氣寫出來的,是修改出來的。所以學習排錯是編程的第一步,雖然隨書光盤有很多代碼,但是這些代碼都不屬于你的。沒有入你腦,唯一讓這些代碼屬于你的辦法就是多抄(打)幾次。當你把一本編程的基礎書都看透了。。至少別人問你這本書的知識你能答得上口,那就是你度過了第一時期了。你可以進入一搬階段了。

             

            一般的階段,這個階段我把它定義為是把這些語法組織成句子,組織成文章的時期。我想問下,大家都上過語文課吧,我們來回想一下,我們學習語文的過程

            =》詞=》句=》文章;

            而編程的學習則是這樣的;

            變量=》函數=》類=》架構

             

            所以我們在初學階段做的都是學那些字,那些詞(其實就是語法糖)然后我們就會學造句,造句的時候就會涉及到把什么詞語組合起來會得到優美的句子,而合理的句子,加上合理的邏輯就會變成一篇優美的文章。但是一篇優美的文章并非那么簡單的。也就是一個程序架構的優美一樣沒那么簡單一樣,需要很多很多學識。

            posted @ 2009-07-20 13:45 ^喬喬^ 閱讀(1864) | 評論 (5)編輯 收藏
            ADO.NET Entity Framework 是什么?是微軟發布的一個對象-關系映射框架,大家都知道JAVA里有一個很有名的組合開發叫SSH,微軟也打造了類似的SSH模式,在VS2008 SP1。微軟集合了兩樣比較重要的東西,一個是ASP.NET MVC 另外一個就是ADO.NET Entity Framework ,習慣上喜歡叫EF。貌似。。還少一個SPRING就完成了微軟版本的SSH了。當然只是感覺上的相似,這個東西跟SSH完全是兩會事。

            ??????ADO.NET Entity Framework是建立在LINQ的基礎上的。提供了從關系數據庫模式到對象的映射。在過去,我們開發的時候,都會先把這些關系數據庫里的表,構建對象。過去哦那種開發模式,我想大家都不陌生了,三層架構里,這個東西是最常用的,而且現在網上也有很多類似的軟件,生成數據庫表對象代碼。只是不知道那個公司把ADO.NET Entity Framework投入了實際開發中,在我初步的試用過程中,我覺得ADO.NET Entity Framework的確能幫我們提高開發速度。但是也有缺陷。就是更新太快,很難投入實際運作,就算是LING現在用的 公司也并不多,大部分都還是停留在2.0時代。真正要實現普及難度不是一般的大,1.1到2.0花了2年多才勉強普及,還是在1。1有重大不足的前提下,現在2。0已經相對問題,要這些公司更新你到3.5難度還不小啊,至少國內是這樣。貌似我還沒有資格評論這些。。。因為太年輕。

            ??? ADO.NET Entity Framework需要定義三層,分別是:邏輯層,概念層,映射層。如果是直接用VS的導航做,這些很方便,但是導航永遠不能滿足復雜的現實,所以我們還是需要自己動手去一步一步的做,當然,如果想先入門一下,可以用導航去感受一下。其實我也是在學習階段,個人感覺貌似.NET的布局有點像向SSH的方向靠攏,突然看到SP1有這么大的整合感覺到。。。貌似.NET會有大動作。

            --------------------------------------------------------背景------來自百度知道---------------------------------------
            ??????? 長久以來,程序設計師和數據庫總是保持著一種微妙的關系,在商用應用程序中,數據庫一定是不可或缺的元件,這讓程序設計師一定要為了連接與訪問數據庫而去學習 SQL 指令,因此在信息業中有很多人都在研究如何將程序設計模型和數據庫集成在一起,對象關系對應 (Object-Relational Mapping) 的技術就是由此而生,像HibernateNHibernate都是這個技術下的產物,而微軟雖然有了ADO.NET這 個數據訪問的利器,但卻沒有像NHibernate這樣的對象對應工具,因此微軟在.NET Framework 2.0發展時期,就提出了一個ObjectSpace的概念,ObjectSpace可以讓應用程序可以用完全對象化的方法連接與訪問數據庫,其技術概念 與NHibernate相當類似,然而ObjectSpace工程相當大,在.NET Framework 2.0完成時仍無法全部完成,因此微軟將ObjectSpace納入下一版本的.NET Framework中,并且再加上一個設計的工具(Designer),構成了現在的 ADO.NET Entity Framework。
              Entity Framework 利用了抽象化數據結構的方式,將每個數據庫對象都轉換成應用程序對象 (entity),而數據字段都轉換為屬性 (property),關系則轉換為結合屬性 (association),讓數據庫的 E/R 模型完全的轉成對象模型,如此讓程序設計師能用最熟悉的編程語言來調用訪問。而在抽象化的結構之下,則是高度集成與對應結構的概念層、對應層和儲存層,以 及支持 Entity Framework 的數據提供者 (provider),讓數據訪問的工作得以順利與完整的進行。
              (1) 概念層:負責向上的對象與屬性顯露與訪問。
              (2) 對應層:將上方的概念層和底下的儲存層的數據結構對應在一起。
              (3) 儲存層:依不同數據庫與數據結構,而顯露出實體的數據結構體,和 Provider 一起,負責實際對數據庫的訪問和 SQL 的產生。
            posted @ 2009-06-22 21:52 ^喬喬^ 閱讀(2521) | 評論 (2)編輯 收藏
            突然心血來潮寫這篇Blog,因為昨天那個面試雜錦,其實面向對象都不難啊,也不難理解。但是很多人覺得很恐怖,所以我就在這里發表一下,自己對面向對象的理解。先說下面向對象,我最早接觸面向對象是JAVA里的,那時候學校開了JAVA程序設計。因為自己在高中就自學了C語言啦,所以學JAVA的時候沒啥難度。只是在面向對象的時候有一點點卡機的跡象,為啥?第一,自己一直覺得,繼承和對代碼的復制粘貼沒啥區別啊,為什么要弄個繼承出來。第二,多態,啥叫多態,這個跟繼承又有什么關系。。因為書本的例子可以說,打部分都是簡單的,CLASSA繼承與A,然后輸出。。。就這類說明性的代碼,沒錯這類代碼是很容易說明繼承的關系。但是如何令人從理論轉化為實際,有一定的困難。所以真正要感受到這個還是需要多多的敲下代碼,用心去感受一下,才能理解內涵的。第2次接觸面向對象是在大二第一學期,突然心血來潮想學C++為啥?因為無知- -!為什么說因為自己無知呢?那時候我以為,要實現界面編程只有用C++的MFC去實現,為了學VC++而開始學C++。因為之前有個JAVA,C語言這類從C語言派生出來的編程語系所以學C++速度就快上很多。但是也出現了一個問題,甚至是跟自己學過的JAVA有很大沖突,C++支持多繼承,私有繼承,等這類繼承。所以一開始有點蒙,而已C++還有一個析構函數。C/C++被人罵的最多的,就是它的內存泄露。什么叫內存泄露,我給它的定義是:沒有在適當的時候釋放適當的內存空間。第三次接觸面向對象是C#大二下學期。那時候Net 2.0剛出不是很久。。因為我看過資料,知道2.0比1.1有跨度更新,所以自己那時候決定從2.0入手,二放棄1.1,其實那時候有學C#的沖動的原因是,JAVA太闊了,而且自己大專出生,JAVA在2006年的時候簡直就是遍地開花,什么北大清鳥啊,什么達內啊,什么新東方啊,什么巨匠啊等等這類東西(偷偷說句,其實我蠻鄙視這些培訓的,覺得有些東西是需要靠自己去學的,并不是說在課堂上講下課就可以學到多少,而且我覺得他們的基礎課程和學校的沒太大分別。他們一邊打著鄙視高校教育的時候,一邊做著高校所做的事,所以我覺得比較返感。至于他們的高級課程,我倒是沒有了解,或許有一定的效果,或許而已。。。這個話題就不說下去了,免得人家拍磚)這個到和JAVA差別不算太大。我之所以轉投C#陣型,其實是被開源嚇的,為啥?開源太闊了,學完java基礎學JSP,學完JSP學SSH,學到這里,才發現自己已經浪費了1年多的時間,還沒有入門,打擊啊。讓后被C#的事件模型吸引,跟著開始C#生涯。開始學C#我可是老老實實從基礎學起的呢,畢竟那時候已經決定跟著C#混飯吃了,基礎很重要。
            ??????體驗繼承的好處的,你需要學習多一樣東西,那樣東西叫多態。至于多態,等我那天又再心學來潮再寫。

            C#里的繼承是可以分為3種的(我自己分的),第一種,實體繼承,第二種虛繼承,第三種接口繼承。有些書籍是這樣分的:實現繼承,接口繼承。
            實體繼承:這個是我們經常用的,基類有自己的功能。并允許部分功能被子類掩蓋,也是我們經常看到的繼承。

            虛繼承:這個類是我自己區別出來的,因為這個虛繼承是介乎與實體繼承和接口繼承之間,虛繼承是指基類之生命了方法,但這類方法沒有任何實體操作,所有實體操作都必須由子類實現,并且子類都必須事先虛基類的每一個方法。

            接口繼承:只繼承函數簽名,沒有繼承任何實現代碼.

            ?????? 我打個比喻,實體繼承可以比喻為一個國家,虛繼承就是類似歐盟這樣的組織,接口繼承就是聯合國。國家是有一定職能的,并且他又行駛這些職能的武力支持,這類職能就是實體繼承的方法。虛繼承,就是你加入了這個組織,你就必須要遵守這些制度。但是歐盟是沒有實體的,也就是沒有職能武力支持,它依靠的是實體子類(加入歐盟的國家)的武力支持。接口繼承,這個聯合國比喻最正確不過。就個名字,什么某些國家掛著它名字出去為非作歹都沒問題。唯一有用的就是他的名字,但是有時候你又不能少了這個名字。

            ??????? 在C#里不支持多繼承,這個不支持多繼承是限制在實體繼承和虛繼承的基礎上的,根據設計C#那個牛人的意思,多繼承所產生的代碼污染代價比繼承來的要大,所以他選擇不支持多繼承,但是需要用到多繼承的情況下,他引入了一個概念,接口。實體繼承只能是一個,接口可以是好多個,就好比如,某個公司只是屬于某個行業,但是它卻擁有很多個榮譽稱號。

            ??????? 上面的分類,只是用來方便我們在什么時候使用什么樣的繼承。

            理解完繼承的分類,我就開始介紹繼承的組成,

            虛方法:帶有virtual基類函數(方法)聲明,子類使用override修飾。在C#中的虛函數(方法)的概念和標準OOP是一致的,可以在子類中重寫虛函數。在調用方法時,會調用對象類型的合適方法。?因為在C#里面默認情況下都不是虛擬的,但是JAVA在默認情況下是虛擬的。所以必須顯式地聲明為virtual才是虛的(構造函數除外)。關于虛方法上C#和C++是一致的。但是C#子類重寫時候需要加上override修飾。

            隱藏方法:當沒有把基類的方法聲明為虛方法的時候,但是派生類又用到了跟基類方法完全相同的名字的方法(不滿足重載的方法),在C#里我們使用關鍵字new來聲明,則表示我們要隱藏一個基類的方法。

            當我們沒有使用new,也沒有使用virtual-override的時候,編譯器會隱式地給我們的代碼加上new,并提示一個警告,所以在編寫穩定代碼的時候,少用默認是個比較好的習慣,至少我覺得這個習慣很好。雖然C#現在沒有夸平臺的概念,但是在C++等其他應用的時候,不一樣的平臺就有不一樣的默認方式。當然在C++里我們常用宏來解決這個夸平臺的。跟那個默認值沒有關系,我只是舉例,舉些不確定100%恰當,但是又容易幫助人理解的例子。

            ???????例如在我們自己開發服務器端控件件的時候,我們經常用到base 關鍵字的,就是調用基類方法去操作,主要作用是區分重新方法和基類方法。

            抽象類;其實就是我上面說的虛基類。有一個比較明顯的特征,有關鍵字abstract因為抽象類和,抽象方法都是沒有具體代碼的,他們的實現具體代碼是依靠子類去實現,例如,有一個基類動物,這個動物是虛基類來的,所有動物我們都讓它具備了行走的方法,讓后人這個子類繼承于動物,老虎這個子類也是繼承于動物,人這個子類的行走方式是用2條腿的,老虎是用4條腿,這樣做的好處就是起到抽象限制作用。我又來一個比如,我給動物下一個定義,你怎么下?最簡單噶,會自己動的物體。就叫動物。好這樣我就定義好了動物是會動的,至于怎么動,是用手動,還是用腳去動,還是用身體去動,沒有沒有細節去區分,只需要知道它動了就行,這個動就是抽象。

            接口:接口這個東西雖然沒限制你繼承多少個?但是繼承了接口,證明這個類就會執行某些函數。接口是不能實現實體化的,也就是說她沒有溝造函數,接口只是一個契約,例如你加入某某協會,協會的契約是你需要交會費,同時我們承認你是我們協會。你可以得到協會的內部資料。例如我們熟悉的Dispose()方法,這個方法和C++里的析構函數差不多,用于清理的,它實現了接口IDisposable,如果你有一個類加入了IDisposable協會,那么你將得到權威的Dispose()方法的承認,具有IDisposable會員的合法資格。你加入了聯合國,并且依照聯合國的武力條例,那么你將得到聯合國授權你是正義的。

            接口就是給你一個“借口”可以光明正大地去“侮辱(污染)”人家。(掛著聯合國名字光明正大的去干澀它國內政。)


            繼承的重點就講完了。至于那些訪問規則就是靠背的,上面那些才是應用繼承的細節額。體現了如何抽象類,如何使用光明正大的污染代碼等一些使用繼承的模糊信息。我沒有參照任何資料去寫這篇文章的,那么講錯了,歡迎大家指出

            posted @ 2009-06-06 22:00 ^喬喬^ 閱讀(1639) | 評論 (2)編輯 收藏
            今天在Q群里看到有人發表面試時候的題目,看了一下,所以順手在這里發表一下看法,包括一些題目;

            第一類繼承類,
            有以下C#代碼
            using?System;
            class?A
            {
            ????
            public?A()
            ????
            {
            ????????test();
            ????}

            ????
            public?virtual?void?test(){}
            }

            class?B:A
            {
            ????
            int?x=1;
            ????
            int?y;
            ????
            public?B()
            ????
            {
            ????????y
            =-1;
            ????}

            ????
            public?override?void?test()
            ????
            {
            ????????Console.WriteLine(
            "x={0},y={1}",x,y);
            ????}

            ????
            static?void?Main(string[]?args)
            ????
            {
            ????????B?b
            =new?B();
            ????}

            }

            這類是一些很基礎的題目主要考察的是對面向對象的了解,,
            首先我們要了解,繼承的時候,類的聲明,初始化。子類的聲明,內部都會先聲明父類。這里我們可以根據父親才有孩子的思想去記憶,沒有父親,哪里來孩子呢,

            上面的程序父類的構造函數是調用子類的TEST()方法,我們看一下TEST方法
            Console.WriteLine("x={0},y={1}",x,y);
            這里是在控制臺輸出X,Y的值,C#是先初始化A讓后在初始化B,在初始化A的時候調用了子類的TEST方法,子類的TEST方法在B沒有初始化的時候Y是沒有給定值的,在沒有給定值的時候INT類型CLR會自動初始一個0到 Y里面去,所以輸出的結果將會是1,0,

            這道題目涉及到了繼承于多態。不過都是很基礎的,但是對于新手,或者不是正規系統地學習過C#的人來說。。就會犯迷糊了。1,0如何出來的。。甚至有人會認為是1,-1,這樣認為的原因是,覺得先初始話B類,在初始化A類。我 不知道那類語言是這樣初始化的,但感覺這樣想法本來就不符合人類的習慣;明顯的:我媽媽生我姐姐的時候,我幫媽媽燒水呢?

            Q群的面試第二道邏輯題;
            7.?某一密碼僅使用K、L、M、N、O共5個字母,密碼中的單詞從左向右排列,密碼單詞必須遵循如下規則:
            1)?密碼單詞的最小長度是兩個字母,可以相同,也可以不同
            2)?K不可能是單詞的第一個字母
            3)?如果L出現,則出現次數不止一次
            4)?M不能使最后一個也不能是倒數第二個字母
            5)?K出現,則N就一定出現
            6)?O如果是最后一個字母,則L一定出現
            問題一:下列哪一個字母可以放在LO中的O后面,形成一個3個字母的密碼單詞?
            A)?K?B)L?C)?M?D)?N

            問題二:如果能得到的字母是K、L、M,那么能夠形成的兩個字母長的密碼單詞的總數是多少?
            A)1個?B)3個?C)6個?D)9個

            問題三:下列哪一個是單詞密碼?
            A)?KLLN?B)?LOML?C)?MLLO?D)NMKO

            這個邏輯題目其實不難的,只要是做程序的,或者可以說是,有過代碼經歷,或者自己設計過算法的人都會做。但是對于剛出校門的學生,這道題目。。。對30%左右的人是有難度的。。。。他們會很執著的想,啥是密碼單詞。

            上面的1-6是形成密碼單詞的條件,問題其實就是在這6個條件下得到的結果,

            問題一:答案是B,為什么是B?因為條件(3)L不只出現1次,根據題目一個3個字母的密碼單詞,LO占了2個,最后一個字母必定是需要重復出現的L

            問題二:答案是A,為什么是1個?第一,根據條件(5),K絕對不會出現,因為問題里沒有N,那么剩下L,M,LM組合的2個字母單詞總個數是4個,分別是LM,LL,ML,MM;根據(3)L不只出現1次,所以排除LM,ML,根據(4)M不能出現在最后一個字母排除MM,最后只剩下一個LL。

            問題三:這個問題是考察所有條件的混合應用,K不能開頭,排除A,?(4)M不能使最后一個也不能是倒數第二個字母,排除B
            6)?O如果是最后一個字母,則L一定出現,排除D,剩下的只有C了,所以答案是C


            雖然我不知道Q群里那個仁兄到底面試啥公司。。。但是發出來的題目。。。沒啥難度啊,只要是有心從事軟件開發的,應該都不難,從公司的角度,面試,筆試,機試,目標都是考察個人能力是否適合這份工作,這2個題目,我覺得靠的應該是。。。應屆生。。
            posted @ 2009-06-05 12:31 ^喬喬^ 閱讀(1230) | 評論 (1)編輯 收藏
                 摘要: 明鏡臺原創(轉載請保留)?1、Jquery學習筆記(一)---- 前言2、Jquery學習筆記(二)---- 強大的選擇器 JQuery的選擇器十分強大,本章主要講的是如何靈活應用選擇器。根據手冊,選擇器被分為以下9類。分別是:1、基本;2、層級;3、基本對象屬性;4、內容;5、可見性;6、屬性;7、子元素;8、表單;9、表單對象屬性;注意:所有的選擇都是返回對象數組;返回值:Array&l...  閱讀全文
            posted @ 2009-06-01 00:58 ^喬喬^ 閱讀(1732) | 評論 (0)編輯 收藏
            明鏡臺原創(轉載請保留)?
            1、Jquery學習筆記(一)---- 前言

            2、Jquery學習筆記(二)---- 強大的選擇器

            ????? 之所以寫這篇BLOG其實是有原因的(見Microsoft Visual Studio 心情記錄),本來想完成了我的LUA后再開始寫的,但是我擔心完成LUA那個系列的BLOG后自己沒有心情寫這篇了。本文很多觀點來自JQuery實戰,部分示例也是,但是我將會在ASP.NET2.0下實現,JQuery的示例是在html或者PHP下。所有示例我都親手敲一次代碼,并進行了一定的改進。。不會侵權吧,我怎么說都花了¥49RMB的。。買了實體書咯。

            ---------------來自維基百科----------------
            jQuery是一款免費且開放源代碼的JavaScript代碼庫,由John?Resig創建。

            授權協議為GPL和MIT許可證雙協議。

            jQuery?1.3版中,引入全新的CSS選擇器引擎Sizzle。[1]同時不再提供Packed版本,因為解壓縮的消耗的時間,遠大于所節省的下載時間,且不利于Debug,且已有Google?AJAX?Libraries?API等公開站臺提供jQuery的js的引用服務,故Packed版本原本的優點已蕩然無存。


            ???? JQuery目前最新的是1.3.2版本,這個版本你可以找到三類文件,分別是:jquery-1.3.2-vsdoc.js,jquery-1.3.2.js,jquery-1.3.2.min.js

            ???? jquery-1.3.2-vsdoc.js 是VS的智能感知版本,但這個版本只能用于智能感知,在瀏覽狀態下這個JS存在不少的BUG,但在開發期能幫我們大大的提高輸入代碼的準確率。實際應用一定要替換為Min版本。
            ???? jquery-1.3.2.js 無壓縮,無智能感知版。這個版本比較大,一般頁面應用比較少,會影響頁面加載。代碼開源。。有興趣可以打開這個文件仔細的看一下,偶是沒這個勇氣的了。
            ??? jquery-1.3.2.min.js 是最常用的版本,在 1.2時期這個壓縮版才27K,但是在1.3版有57K,原因就是我在題頭因用的百科中說明了。

            這三個文件我們都了解了,那么我們在來了解一下,幾個新的定義

            1、什么是JQuery,JQuery是一個代碼庫,并且有非常多居于它的插件,最大的特點是有,跨瀏覽器支持,簡單第封裝DOM操作等。。想知道更多,可以在GOOGLE里自己找。

            2、不唐突的JavaScript;在JQuery里提倡這樣的JavaScript,到底什么是不唐突的JavaScript呢。其實就是實現JS代碼和HTML代碼分離,在過去我們習慣的做法是在標記里加入on****=的屬性來進行JS交互,在JQuery你將可以在HTML代碼不在出現這樣的東西,你也能輕松的令JS進行交互。真正實現樣式,腳本,標記“三權分立”

            3、JQuery強大的選擇器,在過去我們使用DOM的時候,我們只能通過ID去或者標記去找對象,你在JQuery上你可以用CSS來找對象,可以用標記去找,甚至支持查詢方式去查找對象。。強大的選擇器是JQuery的一大特色,也是其中一個重點,我將會有一章詳細描述。

            4、JQuery的鏈式操作在JQuery你將可以令對象好像鏈子那樣一直寫下去。
            ag:block.css('display', 'none').addClass('ThreeCategory').appendTo(target).slideDown();

            5、Ajax。。在Ajax橫行的今天不支持這個東西,怎么行。JQuery對Ajax的支持也十分強大,支持了我們傳說中的JSON數據分裝,使Ajax操作更加隨心所欲。

            6、事件模型,事件其實就是 JS的其中一個核心,我們使用JS很大程度上就是因為她的事件模型。要徹底了解JQuery必須了解他的事件模型。

            7、動畫效果,在JQuery里有兩個我們經常會使用的動畫效果分別是:滑動效果,淡入淡出,靈活的使用這兩個功能會令體檢更加豐富。

            8、如何擴展JQuery,這個是個重點,我們使用JQuery目標是要簡化JS的復雜度,但JQuery庫畢竟不是萬能的,部分東西還是需要我們自己去編寫,這個擴展JQuery就是令你寫的JS更好的集成到JQuery。同時那些JQuery插件也是利用了擴展JQuery,所以不懂擴展就不能說懂得JQuery

            9、強大插件,了解JQuery的插件,或許你想要的效果,這些插件已經幫你實現了,既然能站在巨人的肩膀上,為什么不去依靠巨人。所謂靠山吃山,靠海吃海,考老豆就吃老豆。。。多點了解JQuery可以令你開發速度提速

            這篇前言就到這里。。。。下面將正式開始JQuery之旅
            posted @ 2009-05-26 12:10 ^喬喬^ 閱讀(1445) | 評論 (3)編輯 收藏
            CSS+DIV布局已經變成白菜一樣了,到處都是CSS+DIV布局,去面試一個做網頁的公司,肯定會問,你會CSS+DIV布局不。到底啥是CSS+DIV布局呢?傳統上都是以用TABLE布局的,TABLE布局的要點是有兩個,第一:適當的地方合并行和列,第二:懂TABLE嵌套Table。
            而且還可以直接在頁面上控制Table的高度長度。TABLE布局最大的缺點,除了沉長的TR,TD之外,言論最多的就是SEO里對Table布局的鄙視。大部分SEO人都會覺得Table布局不利于SEO優化。這點。。到真是有點關系,我試過兩個完全一樣的網站,一個是用Table布局的,我是用CSS+DIV布局的,并適當的使用了H標記,在GOOGLE搜索上,我CSS+div布局的網站要比Table布局的要靠前。。。至于為什么,那個不是本文的重點。。忽略掉。

            ?? CSS+DIV布局最大的特點就是HTML文件里的代碼相對比較少,但是也造成了瀏覽器布局問題。。網上很多人都在說,我布局在IE里顯示正常,在FF下全部變形了。其實造成這樣問題的原因是你寫的CSS并不標準,可以說你寫的CSS都是根絕IE的標準來寫的,而不是CSS2.0的國際標準,無論是IE還是FF(3.0版前的我沒留意)都是支持CSS2.0的,但是在技術上,IE有寫模糊功能,可以令到非標準的CSS布局也能正確解析,一下是我寫CSS代碼的五個習慣,我不敢說我這五個習慣都是好習慣,至少我寫的CSS布局不會產生不良效果,也就是我寫的CSS有跨l瀏覽器能力。

            第一:容器類DIV必須要有5個東西{margin,padding,width,height,overflow},什么叫容器類,就是這個DIV只是用來放內部的DIV的,也可以說是一個定位的div..例如:我們經常使用居中,一般是這樣做的
            body
            {
            ????font-size
            :?12px;
            ????margin
            :?0px;
            ????padding
            :?0px;
            ????height
            :?100%;
            ????????width
            :?100%;
            ????overflow
            :?auto;
            ????text-align
            :?center;
            ????display
            :?block;
            }

            /*---body我是作為最頂層容器的---所以它具備了我需要的所有東西,實現的效果是居中,我加上了display:?block;雖然這個是一個默認屬性,但是我們不能保證所有瀏覽器都是默認,(如果是所有瀏覽器都默認的,我自己寫個瀏覽器的默認為none的給你耍)*/
            #body_Div
            {
            ????margin
            :?0px?auto;
            ????padding
            :?0px;
            ????text-align
            :?left;
            ????width
            :?1003px;
            ????height
            :100%;
            ????overflow
            :auto;
            }

            /*這個是核心層,多有的元素基本都是在這個層里的,這個層也具備了我想要的屬性,text-align:?left;?因為在上層我把文本對齊成為居中,所以這個層我要把它還原為左對齊margin:?0px?auto;?一般IE的CSS編寫者不會有這個auto值的,在IE會自動,但是在FF如果少了auto你將會發現FF里你的核心部分不是居中的。所以要做到通用,我們就必須要加上auto值,IE也支持auto值*/

            第二:浮動對象,都擁有獨立的父DIV;關于這點。。有意見的人可能不少,持有的觀點就是,“你這樣做只會令DIV過分的多,過于復雜”,其實,我也不想這樣做,但是- -!IE對于浮動對象的{margin,padding}存在BUG所以為了減少一切可能的出錯,我唯有多花費一點代碼,說實在的我只是想它更健康。這個父DIV主要作用其實就是令到內部浮動對象更可控制,這個父DIV就是一個單純的容器DIV

            第三:所有的浮動都需要閉合;這個有經驗的人都知道。。用完浮動你肯定需要把它閉合掉的,不閉合,可能不同瀏覽器在解析的時候會把你的浮動變成向下默認,(可以這樣解析:就是元素內部的子元素都默認具有浮動屬性)

            第四:一個行向浮動如果超過3個那么請使用UL來實現浮動

            第五:靈活使用類選擇,我個人的做法是,所有的id選擇器都是用于布局的,類選擇器都是用于呈現效果的,這樣做的好處就是,當你想要的效果出現問題的時候,更快速地找到錯誤。這個是我有意識的把“架構”和“內容”分離。

            明鏡臺
            posted @ 2009-05-25 14:22 ^喬喬^ 閱讀(2073) | 評論 (0)編輯 收藏
            Microsoft Visual Studio 我想所有編程的人都會熟悉這個IDE,不熟悉至少都聽說過,Microsoft Visual Studio 這個命名是從2003版開始的,這個版本開始就是一個集合版,里面有WEB,VB,c#,J#,javascript,C++等主流語言,2003版本,本人用得很少,甚至只用過2次,長時間使用的是2005版,2005和2003有很大的進步,2008推出的時候更是開始使用2008了,其實2008要比2005要好,首先智能感知上就完美了很多,不用擔心大小寫問題,尤其是編寫JAVASCRIPT腳本..(2008 SP1)最近使用了JQuery的jquery-1.3.2.min-vsdoc.js"才發現...原來寫JAVASCRIPT也能像寫C#代碼一樣高效率...不用在擔心大小寫錯誤的問題....以前寫JQuery基本都是在API上復制參數的,因為手答,容易出,而且JS出錯也并不好找,,至于要說如何發現jquery-1.3.2.min-vsdoc.js的那就要提一下ASP.NET MVC了,雖然這個框架是榮損參半,但照我個人感覺來說,這個框架和VS2008 SP1的搭配還是十分優秀的.比一些開源的.NET ,MVC要方便...而且我在ASP.NET MVC里找到很多的struts2.0的影子,因為我大學的時候花過好大幾個月去學習struts2.0,所以在學習和使用ASP.NET MVC上更感覺順手..雖然struts2.0并沒有struts那么風光...

            ??????? 本人寫著篇文章其實很興奮...所以特寫一篇隨筆來激動一下...

            ????????另外本人本Jquery深深地吸引....努力學習ING.....LUA只能停一下了,,LUA畢竟只是興趣...Jquery我覺得將會給我工作帶來很大的方便...所以決定以后寫JS用Jquery別想我用prototype,除非....prototype也提供智能感知包....

            明鏡臺
            posted @ 2009-05-18 23:59 ^喬喬^ 閱讀(1863) | 評論 (4)編輯 收藏

            1、lua學習之入門(一)----環境搭建

            2、lua學習之入門(二)----基礎語法1

            3、lua學習之入門(二)----基礎語法2

            4、lua學習之入門(三)----函數

            ???? 在LUA里函數是個十分重要的內容,因為我們實際開發的時候,用的最多的就是函數,用函數是封裝各個實現,在Q群里曾經聽一些大蝦說過,寫LUA必須要懂得閉包,常用系統函數,還有范型for寫迭代器,最后就是編譯和運行還有錯誤信息.其實這章,我就卡了一下殼,卡殼的地方在閉包,因為我沒有完全理解閉包的作用,和閉包的好處,網上也沒有明確的說明閉包的優劣,所以閉包的概念,我也只能以個人感覺去寫,如果我說得不對,歡迎賜教.如果對閉包理解很深,歡迎來指教...你要偶拜你為師也行,達者為師啊,偶很好學的.

            函數有兩種用途:1.完成指定的任務,這種情況下函數作為調用語句使用;2.計算并返回值,這種情況下函數作為賦值語句的表達式使用。

            ?? 其實我們接觸最早的,就是函數,還記得我們的第一個LUA嗎?print();這就是一個函數.可以理解****()都可以當做是函數,其實大部分編程語言的函數都是以這個方式一共調用的.認識了什么是函數,那么我們就自己編寫一個函數吧

            function?maxFun(a , b)
            ???
            if ?a > b?then
            ???
            return ?a;
            ???
            else
            ?????
            return ?b;
            ??end
            end

            -- 我們用一個輸出語句把我們的函數結果顯示出來 , 證明我們寫的函數沒有問題

            print (maxFun( 4 , 3 ));
            上面這個函數
            , 其實很簡單就是比較兩個數的大小 . 最后運行的結果我們得到結果是4 , 這里使用的是函數的第1種任務 , 判斷兩個數的大小 , 在LUA里函數是可以返回多個值的 , 這個點和其他編程語言有很大的區別 , 那就很容易造成錯覺 , 多個返回值 , 那我如何獲得各個返回值呢 ? 看例子

            function?returnAnyValue()
            ????????
            return ? 1 , 2 , 3 , 4 ;
            ???end

            ????a
            , b , c , d? = ?returnAnyValue();
            e
            , f , g? = ?returnAnyValue();
            h
            , i , j , k , l? = ?returnAnyValue();

            -- [[
            print ( " a: " .. a .. " ?b: " .. b .. " ?c: " .. c .. " ?d: " .. d .. " ?e: " .. e .. " ?f: " .. f .. " ?g: " .. g .. " ?h: " .. h .. " ?i: " .. i .. " ?j: " .. j .. " ?k: " .. k .. " ?l: " .. l .. " ?! " );
            ]]
            -- 這樣編譯是出錯的 , 提示告訴我們l為nil不能輸出 .

            -- 所以我們把程序修改為

            print ( " a: " .. a .. " ?b: " .. b .. " ?c: " .. c .. " ?d: " .. d .. " ?e: " .. e .. " ?f: " .. f .. " ?g: " .. g .. " ?h: " .. h .. " ?i: " .. i .. " ?j: " .. j .. " ?k: " .. k .. " ?! " );

            結果如下
            :
            ???a
            : 1 ?b : 2 ?c : 3 ?d : 4 ?e : 1 ?f : 2 ?g : 3 ?h : 1 ?i : 2 ?j : 3 ?k : 4


            雖然我們不能輸出L的值,但是我們根據錯誤提示可以知道l的值是nil的.

            論述完返回值,那么我們要看參數數了,LUA支持可變參數的模式的使用的方法和C語言的差不多,不熟悉的可以先學C語言,畢竟我看到的LUA大多數都是嵌入C中的,所以C/C++至少你要會.

            好了我們要進入我覺得比較難的點:閉包

            在我接觸的編程語言里,其實還沒發現過閉包的概念,坦白的說一句,就是LUA我才接觸閉包的.閉包從網上的資料來看,就是JAVASCRIPT里的匿名函數的使用(我接觸新語言的時候,總喜歡用自己接觸過的語言去進行對比,去學習.我覺得這種學習的方法還是比較有效果的,有興趣的朋友也可以試試這個方法.),在我看了網上公開的閉包程序,最大的特點就是使用,外面的函數有自己的局部變量,內部的匿名函數使用了外部函數的局部變量.有點像面向對象思想里的意思,后來我在LUA的一個論壇看到一篇關于閉包的定義,如下:

            當一個函數內部嵌套另一個函數定義時,內部的函數體可以訪問外部的函數的局部變量,這種特征我們稱作詞法定界。雖然這看起來很清楚,事實并非如此,詞法定界加上第一類函數在編程語言里是一個功能強大的概念,很少語言提供這種支持。
            技術上來講,閉包指值而不是指函數,函數僅僅是閉包的一個原型聲明

            這個是我在網上找的一個關于閉包的例子,個人感覺水平有限.可能使用網上的例子更有說服力

            下面看一個簡單的例子,假定有一個學生姓名的列表和一個學生名和成績對應的表;現在想根據學生的成績從高到低對學生進行排序,可以這樣做:

            names?
            = ?{ " Peter " , ? " Paul " , ? " Mary " }

            grades?
            = ?{Mary? = ? 10 , ?Paul? = ? 7 , ?Peter? = ? 8 }

            table
            . sort (names , ?function?(n1 , ?n2)

            ????
            return ?grades[n1]? > ?grades[n2]???? -- ?compare?the?grades

            end)
            假定創建一個函數將上面的功能包裝起來

            ???function sortbygrade (names, grades)

            ?? ??? table.sort(names, function (n1, n2)

            ????????? return grades[n1] > grades[n2]??? -- compare the grades

            ??? end)

            end
            例子中包含在sortbygrade函數內部的sort中的匿名函數可以訪問sortbygrade的參數grades,在匿名函數內部grades不是全局變量也不是局部變量,我們稱作外部的局部變量(external local variable)或者upvalue。(upvalue意思有些誤導,然而在Lua中他的存在有歷史的根源,還有他比起external local variable簡短)。


            這個例子主要說明的是在外部函數和內部函數之見參數的使用,函數中就可以直接用變量進行傳值,這里需要說明一下的是table.sort(存放元素的數組,排序函數)具體的等后面我介紹常用庫的時候說.只要知道是表排序就好.

            函數就寫出來的,但是我們需要更直觀的看到這些資料
            所以我在最下面加上了如下代碼

            print ( " --------- " )
            sortbygrade?(names
            , ?grades);

            for ?v?in?pairs(names)? do

            print (names[v])
            end
            輸出結果為
            Mary
            Peter
            Paul
            我將grades = {Mary = 7, Paul = 8, Peter = 9}改了再看效果
            Peter
            Paul
            Mary

            function?newCounter()

            ????
            local?i?=?0

            ????
            return?function()?????--?anonymous?function

            ???????i?
            =?i?+?1

            ????????
            return?i

            ????end

            end

            ?

            c1?
            =?newCounter()

            print(c1())??-->?1

            print(c1())??-->?2

            print(c1())??-->?3

            結果代碼里已經顯示了,我就不說了,但是大家看到這個結果?你想到了什么?
            對象?就是對象,看以下C#代碼
            public?class?CC
            {
            ????
            private?int?a;

            ????
            public?CC()
            ????
            {
            ???????a
            =0;
            ????}


            ????
            public?int?newCounter()
            ????
            {
            ???????
            this.a=this.a+1;
            ???????retrun?
            this.a;
            ????}

            }

            如果LUA代碼里C1=newCounter();C2=newCounter()
            ?print(c2())--->1
            是不是跟我們聲明一個對象十分的類似呢?所以我推斷閉包在一定程度上實現了部分面向對象的功能,肯定有一定的差別的,我只是說類似..而且我看代碼有點像C語言去實現面向對象的感覺...

            閉包還可以實現類似JAVA里沙箱的功能,(來自網上,我并沒有運行這段代碼)
            do

            ????local?oldOpen?
            =?io.open

            ????io.
            open?=?function?(filename,?mode)

            ???????
            if?access_OK(filename,?mode)?then

            ???????????
            return?oldOpen(filename,?mode)

            ???????
            else

            ???????????
            return?nil,?"access?denied"

            ???????
            end

            ????
            end

            end

            *正確的尾調用
            這個迷宮游戲是典型的狀態機,每個當前的房間是一個狀態。我們可以對每個房間寫一個函數實現這個迷宮游戲,我們使用尾調用從一個房間移動到另外一個房間。一個四個房間的迷宮代碼如下:

            function?room1?()

            ????local?move?
            =?io.read()

            ????
            if?move?==?"south"?then

            ???????
            return?room3()

            ????elseif?move?
            ==?"east"?then

            ???????
            return?room2()

            ????
            else

            ???????
            print("invalid?move")

            ???????
            return?room1()???--?stay?in?the?same?room

            ????
            end

            end

            ?

            function?room2?()

            ????local?move?
            =?io.read()

            ????
            if?move?==?"south"?then

            ???????
            return?room4()

            ????elseif?move?
            ==?"west"?then

            ???????
            return?room1()

            ????
            else

            ???????
            print("invalid?move")

            ???????
            return?room2()

            ????
            end

            end

            ?

            function?room3?()

            ????local?move?
            =?io.read()

            ????
            if?move?==?"north"?then

            ???????
            return?room1()

            ????elseif?move?
            ==?"east"?then

            ???????
            return?room4()

            ????
            else

            ???????
            print("invalid?move")

            ???????
            return?room3()

            ????
            end

            end

            ?

            function?room4?()

            ????
            print("congratilations!")

            end

            我們可以調用room1()開始這個游戲。

            如果沒有正確的尾調用,每次移動都要創建一個棧,多次移動后可能導致棧溢出。但正確的尾調用可以無限制的尾調用,因為每次尾調用只是一個goto到另外一個函數并不是傳統的函數調用
            (以上代碼來源網上)
            正確尾調用論述的意義在于..棧溢出的問題,不正確的尾調用是存在棧溢出問題的.

            這篇寫的我自己都不是很滿意...因為這個東西..需要點時間消化...等我消化了再來整理一下,就好象開頭,我也是一個LUA新手,我只能把我認識的弄出來,而且正確上..也非絕對..其實我的目的只是傳播我的學習的思想.

            明鏡臺
            posted @ 2009-05-14 13:14 ^喬喬^ 閱讀(2084) | 評論 (0)編輯 收藏
            僅列出標題  下一頁
            人妻久久久一区二区三区| 国产呻吟久久久久久久92| 久久99久国产麻精品66| 亚洲AV无码久久精品蜜桃| 久久综合狠狠综合久久| 国产精品午夜久久| 国产成人无码精品久久久性色| 久久久久亚洲AV无码网站| 久久精品国产精品国产精品污| 久久毛片免费看一区二区三区| 伊色综合久久之综合久久| 色88久久久久高潮综合影院| 91性高湖久久久久| 日韩精品久久久肉伦网站| 狠狠人妻久久久久久综合| 精品综合久久久久久888蜜芽| 日韩一区二区久久久久久| 伊人色综合久久天天人手人婷| 91久久国产视频| 国产精品久久成人影院| 中文无码久久精品| 久久国产欧美日韩精品免费| 成人亚洲欧美久久久久 | 婷婷综合久久狠狠色99h| 国内精品伊人久久久久777| 久久国产福利免费| 曰曰摸天天摸人人看久久久| 亚洲国产精品无码久久久不卡 | 国产成人久久精品二区三区| 久久这里只有精品首页| 婷婷久久精品国产| 久久露脸国产精品| 亚洲国产成人久久笫一页 | 东方aⅴ免费观看久久av| 亚洲午夜无码久久久久小说| 激情综合色综合久久综合| 久久综合久久久| 久久艹国产| 中文字幕精品久久久久人妻| 亚洲а∨天堂久久精品9966| 久久精品18|