::^乔乔^::明镜台::原创空间::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 ^乔乔^ 阅读(3035) | 评论 (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 ^乔乔^ 阅读(1834) | 评论 (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 ^乔乔^ 阅读(2481) | 评论 (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 ^乔乔^ 阅读(1610) | 评论 (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 ^乔乔^ 阅读(1195) | 评论 (1)编辑 收藏
     摘要: 明鏡臺原創(轉載請保留) 1、Jquery學習筆記(一)---- 前言2、Jquery學習筆記(二)---- 強大的選擇器 JQuery的選擇器十分強大,本章主要講的是如何靈活應用選擇器。根據手冊,選擇器被分為以下9類。分別是:1、基本;2、層級;3、基本對象屬性;4、內容;5、可見性;6、屬性;7、子元素;8、表單;9、表單對象屬性;注意:所有的選擇都是返回對象數組;返回值:Array&l...  阅读全文
posted @ 2009-06-01 00:58 ^乔乔^ 阅读(1710) | 评论 (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 ^乔乔^ 阅读(1419) | 评论 (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 ^乔乔^ 阅读(2046) | 评论 (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 ^乔乔^ 阅读(1833) | 评论 (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 , =  returnAnyValue();
e
, f , =  returnAnyValue();
h
, i , j , k , =  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 ^乔乔^ 阅读(2056) | 评论 (0)编辑 收藏
仅列出标题  下一页