??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品亚洲色婷婷99久久精品,国产成人精品日本亚洲,亚洲精品V欧洲精品V日韩精品http://m.tkk7.com/jsdk999/zh-cnMon, 12 May 2025 10:57:02 GMTMon, 12 May 2025 10:57:02 GMT60用JS实现的MAPc?/title><link>http://m.tkk7.com/jsdk999/archive/2006/12/01/84897.html</link><dc:creator>WindDC</dc:creator><author>WindDC</author><pubDate>Fri, 01 Dec 2006 09:24:00 GMT</pubDate><guid>http://m.tkk7.com/jsdk999/archive/2006/12/01/84897.html</guid><wfw:comment>http://m.tkk7.com/jsdk999/comments/84897.html</wfw:comment><comments>http://m.tkk7.com/jsdk999/archive/2006/12/01/84897.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://m.tkk7.com/jsdk999/comments/commentRss/84897.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jsdk999/services/trackbacks/84897.html</trackback:ping><description><![CDATA[ <p>本程序用JS写的一个类拟于JAVA中MAPc?可以寚w值对q行l护.<br /><br /><br />/*<br />name:    Map.js<br />author:  WindDC<br />date:    2006-10-27<br />content: 本程序用JS实现cLJAVA中MAP对像的功?br />*/</p> <p>function Node(key,value){//键值对对象<br />    this.key=key;<br />    this.value=value;<br />}</p> <p>function Map(){//Mapc?br />    this.nodes=new Array();<br />}</p> <p>Map.prototype.put=function(key,value){//往容器中加入一个键值对<br />        for(var i=0;i<this.nodes.length;i++)<br />           if(this.nodes[i].key==key){//如果键值已存在Q则putҎ为更新已有数?br />               this.nodes[i].value=value;<br />               return;<br />           }<br />        var node=new Node(key,value);<br />        this.nodes.push(node);<br />        return;<br />}//put</p> <p>   <br />Map.prototype.get=function(key){//获取指定键的?br />        for(var i=0;i<this.nodes.length;i++)<br />           if(this.nodes[i].key==key)<br />              return this.nodes[i].value;<br />        return null;<br />}//get<br />     <br />Map.prototype.size=function(){//获取容器中对象的个数<br />     return this.nodes.length;<br />}//size</p> <p>         <br />Map.prototype.clear=function(){//清空容器<br />     while(this.nodes.length>0)<br />        this.nodes.pop();      <br />}//clear<br /> <br />Map.prototype.remove=function(key){//删除指定?br />     for(var i=0;i<this.nodes.length;i++)<br />        if(this.nodes[i].key==key){<br />           if(i>0)<br />              var nodes1=this.nodes.concat(this.nodes.slice(0,i-1),this.nodes.slice(i+1));<br />           else//删除的是W一个元?br />             var nodes1=nodes.slice(1);<br />           this.nodes=nodes1;</p> <p>        }<br />}//remove<br /><br />    <br />Map.prototype.isEmpty=function(){//是否为空<br />     if(this.nodes.length==0)<br />       return true;<br />     else<br />       return false;<br />}//isEmpty<br />    <br />Map.prototype.toString=function(){<br />     var str="[";<br />     for(var i=0;i<this.nodes.length;i++){<br />        if(i<this.nodes.length-1)<br />           str=str+this.nodes[i].key+",";<br />       else<br />           str=str+this.nodes[i].key;    <br />    }<br />    str=str+"]";<br />    return str;<br />}</p> <img src ="http://m.tkk7.com/jsdk999/aggbug/84897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jsdk999/" target="_blank">WindDC</a> 2006-12-01 17:24 <a href="http://m.tkk7.com/jsdk999/archive/2006/12/01/84897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net实现的数据库链接?/title><link>http://m.tkk7.com/jsdk999/archive/2006/12/01/84892.html</link><dc:creator>WindDC</dc:creator><author>WindDC</author><pubDate>Fri, 01 Dec 2006 09:11:00 GMT</pubDate><guid>http://m.tkk7.com/jsdk999/archive/2006/12/01/84892.html</guid><wfw:comment>http://m.tkk7.com/jsdk999/comments/84892.html</wfw:comment><comments>http://m.tkk7.com/jsdk999/archive/2006/12/01/84892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jsdk999/comments/commentRss/84892.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jsdk999/services/trackbacks/84892.html</trackback:ping><description><![CDATA[ <p>        本文是用.net实现的数据库链接?大体体现了数据库链接池的实现思想,ADO.NET已经提供了很好的链接池维?所以本E序基本没有什么实用h?<br /><br />1.链接池管理类<br />using System;<br />using System.Data;<br />using System.Data.SqlClient;<br />using System.Data.OleDb;<br />using System.Collections;<br />using System.Configuration;</p> <p>/// <summary><br />/// DbConnectionPool 的摘要说?br />/// </summary></p> <p>namespace dbopr<br />{<br />    public class DbConnectionPool<br />    {<br />        //定义存放数据库链接的队列<br />        private static Queue connections=new Queue();</p> <p>        //数据库参?br />        private static string ConnString = "";                                    //链接字符?/p> <p>        //链接池参?br />        private static int InitSize = 20;                                         //初始化链接池大小<br />        private static int MaxSize = 100;                                         //最大链接数<br />        private static int QueueSize = 50;                                        //队列中最大维护的链接?br />        private static int ConnNum = 0;                                           //pȝl护的链接L</p> <p> <br />        //定义数据库类型,1表示为SqlServer数据库,2表示其它的OLE DBQ默认ؓSqlServer<br />        private static int  DbType = 1;<br />        public static int DbType<br />        {<br />            set<br />            {<br />                DbType = value;<br />            }<br />        }</p> <p>        private DbConnectionPool()<br />        {<br />            try{<br />                ConnString = Configuration.connectionStrings["DbSource"].connectionString;<br />                InitSize = int.Parse(Configuration.connectionStrings["InitSize"].connectionString);<br />                MaxSize = int.Parse(Configuration.connectionStrings["MaxSize"].connectionString);<br />                QueueSize = int.Parse(Configuration.connectionStrings["QueueSize"].connectionString);<br />                DbType = int.Parse(Configuration.connectionStrings["DbType"].connectionString);<br />                initPool();<br />            }<br />            catch(Exception e) {<br />            }<br />        }<br />        <br />        //初始化链接池<br />        private static void initPool(){<br />            int i;<br />            for (i = 1; i <= InitSize; i++) {<br />                if (DbType == 1)<br />                    connections.Enqueue(newSqlConn());<br />                else<br />                    connections.Enqueue(newOleConn());<br />            }<br />        }</p> <p>        //获取一个Sql Server链接对象<br />        private static SqlConnection newSqlConn()<br />        {<br />            ConnNum++;<br />            return new SqlConnection(ConnString);<br />        }<br />        <br />        //获取一个OLE DB链接对像<br />        private static OleDbConnection newOleConn() <br />        {<br />            ConnNum++;<br />            return new OleDbConnection(ConnString);<br />        }</p> <p>        //获取一个数据库链接<br />        public static IDbConnection getConn() {<br />            if (connections.Count == 0)                                  //如果队列中链接用完,则新Z个链接放入队?br />            {<br />                if (ConnNum > MaxSize)                                   //如果当前zd链接辑ֈ最大,则等待链?br />                    return null;<br />                else<br />                {<br />                    if (DbType == 1)<br />                        connections.Enqueue(newSqlConn());<br />                    else<br />                        connections.Enqueue(newOleConn());<br />                    return connections.Dequeue();<br />                }<br />            }<br />            else<br />                return connections.Dequeue();<br />        }</p> <p>        //释放一个活q链?br />        public static void reConn(IDbConnection conn) {<br />            if (connections.Count > QueueSize)                           //如果队列中元素个数已辑ֈ最大,则关闭链?br />                conn.Close();<br />            else<br />                connections.Enqueue(conn);<br />        }</p> <p>        //销毁链接池<br />        public static void ClearPool() {<br />            while(connections.Count>0)<br />                 (IDbConnection)connections.Dequeue().Close();<br />        }<br />    }<br />}<br /><br />2.链接生成c?br />using System;<br />using System.Data;<br />using System.Data.SqlClient;<br />using System.Data.OleDb;<br />using System.Configuration;<br />using System.Web;</p> <p>/// <summary><br />/// DbConn 的摘要说?br />/// </summary></p> <p>namespace dbopr<br />{<br />    public class DbConnection<br />    {<br />        private static IDbConnection conn;<br />        <br />        public DbConnection()<br />        {<br />            //<br />            // TODO: 在此处添加构造函数逻辑<br />            //<br />        }</p> <p>        public static SqlConnection getSqlConn()<br />        {<br />            //获取链接池中的Sql Server的链?br />            conn = DbConnectionPool.getConn();<br />            return (SqlConnection)conn;<br />        }</p> <p>        public static OleDbConnection getOleConn() {<br />            //获取其它OLE DB的链?br />            conn = DbConnectionPool.getConn();<br />            return (OleDbConnection)conn;<br />        }</p> <p>        public static void Close() {<br />            //攑֛用过的链?br />            DbConnectionPool.reConn(conn);<br />        }<br />    }<br />}</p> <img src ="http://m.tkk7.com/jsdk999/aggbug/84892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jsdk999/" target="_blank">WindDC</a> 2006-12-01 17:11 <a href="http://m.tkk7.com/jsdk999/archive/2006/12/01/84892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看到一遍好文章啊,大家分n下!--抽象cd接口的用场?/title><link>http://m.tkk7.com/jsdk999/archive/2006/09/22/71274.html</link><dc:creator>WindDC</dc:creator><author>WindDC</author><pubDate>Fri, 22 Sep 2006 03:32:00 GMT</pubDate><guid>http://m.tkk7.com/jsdk999/archive/2006/09/22/71274.html</guid><wfw:comment>http://m.tkk7.com/jsdk999/comments/71274.html</wfw:comment><comments>http://m.tkk7.com/jsdk999/archive/2006/09/22/71274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jsdk999/comments/commentRss/71274.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jsdk999/services/trackbacks/71274.html</trackback:ping><description><![CDATA[abstract class和interface是Java语言中对于抽象类定义q行支持的两U机Ӟ正是׃q两U机制的存在Q才赋予了Java强大的面向对象能力?abstract class和interface之间在对于抽象类定义的支持方面具有很大的怼性,甚至可以怺替换Q因此很多开发者在q行抽象cd义时对于 abstract class和interface的选择昑־比较随意。其实,两者之间还是有很大的区别的Q对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意囄理解是否正确、合理。本文将对它们之间的区别q行一番剖析,试图l开发者提供一个在二者之间进行选择的依据?br /><br />理解抽象c?br /><br />abstract class和interface在Java语言中都是用来进行抽象类Q本文中的抽象类q从abstract class译而来Q它表示的是一个抽象体Q而abstract class为Java语言中用于定义抽象类的一U方法,误者注意区分)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q?br /><br />在面向对象的概念中,我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l一个具体的对象Q这Lcd是抽象类。抽象类往往用来表征我们在对问题领域q行分析、设计中得出的抽象概念,是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:如果我们q行一个图形编辑Y件的开发,׃发现问题领域存在着圆、三角Şq样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它是一个抽象概c正是因为抽象的概念在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?br /><br />在面向对象领域,抽象cM要用来进行类型隐藏。我们可以构造出一个固定的一l行为的抽象描述Q但是这l行为却能够有Q意个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟悉OCP的读者一定知道,Z能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在?br /><br />从语法定义层面看abstract class和interface<br /><br />在语法层面,Java语言对于abstract class和interfacel出了不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同?br /><br />使用abstract class的方式定义Demo抽象cȝ方式如下Q?br /><br />abstract class Demo ?br />abstract void method1();<br />abstract void method2();<br />?br />?br /><br />使用interface的方式定义Demo抽象cȝ方式如下Q?br /><br />interface Demo {<br />void method1();<br />void method2();<br />?br />}<br /><br />在abstract class方式中,Demo可以有自q数据成员Q也可以有非abstarct的成员方法,而在interface方式的实CQDemo只能够有静态的不能被修改的数据成员Q也是必须是static final的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的。从某种意义上说Qinterface是一U特DŞ式的abstract class?br /><br />从编E的角度来看Qabstract class和interface都可以用来实现design by contract的思想。但是在具体的用上面还是有一些区别的?br /><br />首先Qabstract class在Java语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?br /><br />其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这?增加一些复杂性,有时会造成很大的麻烦?br /><br />在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)以适应新的情况Q比如,d新的Ҏ或者给已用的方法中d新的参数Q时Q就会非常的ȝQ可能要p很多的时_对于zcd多的情况Q尤为如此)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ可以了?br />同样Q如果不能在抽象cM定义默认行ؓQ就会导致同LҎ实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心?br /><br />从设计理念层面看abstract class和interface<br /><br />上面主要从语法定义和~程的角度论qCabstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?br /><br />前面已经提到q,abstarct class在Java语言中体C一U承关p,要想使得l承关系合理Q父cdzcM间必d在is a关系Q即父类和派生类在概忉|质上应该是相同的Q参考文献?〕中有关于is a关系的大幅深入的论qͼ有兴的读者可以参考)。对于interface 来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现了interface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明?br /><br />考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:<br /><br />使用abstract class方式定义DoorQ?br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()Q?br />}<br />使用interface方式定义DoorQ?br />interface Door {<br />void open();<br />void close();<br />}<br />其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?br />如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ了展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)Q下面将|列出可能的解决ҎQƈ从设计理念层面对q些不同的方案进行分析?br /><br />解决Ҏ一Q?br />单的在Door的定义中增加一个alarmҎQ如下:<br />abstract class Door {<br />abstract void open();<br />abstract void close()Q?br />abstract void alarm();<br />}<br />或?br />interface Door {<br />void open();<br />void close();<br />void alarm();<br />}<br /><br />那么h报警功能的AlarmDoor的定义方式如下:<br /><br />class AlarmDoor extends Door {<br />void open() { ?}<br />void close() { ?}<br />void alarm() { ?}<br />}<br />或?br />class AlarmDoor implements Door ?br />void open() { ?}<br />void close() { ?}<br />void alarm() { ?}<br />?br />q种Ҏq反了面向对象设计中的一个核心原则ISPQInterface Segregation PricipleQ,在Door的定义中把Door概念本n固有的行为方法和另外一个概忉|警器的行为方法؜在了一赗这样引L一个问题是那些仅仅依赖于Doorq个概念的模块会因ؓ报警器这个概늚改变Q比如:修改alarmҎ的参敎ͼ而改变,反之依然?br /><br />解决Ҏ二:<br />既然open、close和alarm属于两个不同的概念,ҎISP原则应该把它们分别定义在代表q两个概늚抽象cM。定义方式有Q这两个概念都?abstract class方式定义Q两个概念都使用interface方式定义Q一个概念用abstract class方式定义Q另一个概念用interface方式定义?br /><br />昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?br /><br />如果两个概念都用interface方式来定义,那么反映出两个问题Q?、我们可能没有理解清楚问题领域,AlarmDoor在概忉|质上到底?Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:我们通过对于问题领域的分析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均用interface方式定义Q反映不Zq含义?br /><br />如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关pd本质上是is a关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行ؓQ所以报警概念可以通过interface方式定义。如下所C:<br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()Q?br />}<br />interface Alarm {<br />void alarm();<br />}<br />class AlarmDoor extends Door implements Alarm {<br />void open() { ?}<br />void close() { ?}<br />void alarm() { ?}<br />}<br />q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是is a关系Qinterface表示的是like a关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又h Door的功能,那么上述的定义方式就要反q来了?br />l论<br />abstract class和interface是Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ它们表现了概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望读者朋友能够细l体会?br /><br />很多人有q这L疑问Qؓ什么有的地方必M用接口而不是抽象类Q而在另一些地方,又必M用抽象类而不是接口呢Q或者说Q在考虑Javacȝ一般化问题Ӟ很多Z在接口和抽象cM间犹豫不冻I甚至随便选择一U?br /><br />  实际上接口和抽象cȝ选择不是随心所Ʋ的?要理解接口和抽象cȝ选择原则Q有两个概念很重要:对象的行为和对象的实现。如果一个实体可以有多种实现方式Q则在设计实体行为的描述方式Ӟ应当辑ֈq样一个目标:在用实体的时候,无需详细了解实体行ؓ的实现方式。也是_要把对象的行为和对象的实现分d来。既然Java的接口和抽象c都可以定义不提供具体实现的ҎQ在分离对象的行为和对象的实现时Q到底应该用接口还是用抽象类呢?<br /><br />通过抽象cd立行为模?br /><br />  在接口和抽象cȝ选择上,必须遵守q样一个原则:行ؓ模型应该L通过接口而不是抽象类定义。ؓ了说明其原因Q下面试着通过抽象cd立行为模型,看看会出C么问题?br /><br />  假设要ؓ销售部门设计一个YӞq个软g包含一个“发动机”(MotorQ实体。显然无法在发动机对象中详细地描q发动机的方斚w面,只能描述某些对当前Y件来说重要的特征。至于发动机的哪些特征是重要的,则要与用P销售部门)交流才能定?br /><br />  销售部门的求每一个发动机都有一个称为马力的参数。对于他们来_q是惟一值得兛_的参数。基于这一判断Q可以把发动机的行ؓ定义Z下行为?br /><br />  行ؓ1Q查询发动机的马力,发动机将q回一个表C马力的整数?br /><br />  虽然现在q不清楚发动机如何取得马力这个参敎ͼ但可以肯定发动机一定支持这个行为,而且q是所有发动机惟一值得x的行为特征。这个行为特征既可以用接口定义,也可以用抽象cd义。ؓ了说明用抽象cd义可能出现的问题Q下面用抽象cd立发动机的行为模型,q用JavaҎ描述行ؓ1Q代码如下:<br /><br />public abstract Motor{<br /><br />abstract public int getHorsepower();<br /><br />}<br /><br />  在Motor抽象cȝ基础上构造出多种具体实现Q例如A型发动机、B型发动机{,再加上系l的其它部分Q最后得?.0版的软gq交付用。一D|间过MQ现在要设计2.0版的软g。在评估2.0版Y仉求的q程中,发现一部分发动机是电池驱动的Q而电池需要一定的充电旉。销售部门的人希望能够通过计算机查阅充甉|间。根据这一要求定义一个新的行为,如图1所C?br /><br />  行ؓ2Q查询电驱动发动机的充电旉Q发动机返回一个表C充甉|间的整数?br /><br />  用JavaҎ来描q这个行为,代码如下Q?br /><br />public abstract BatteryPoweredMotor extends Motor{<br /><br />abstract public int getTimeToRecharge();<br /><br />}<br /><br />  在销售部门的软g中,电驱动发动机也以cȝ形式实现Q但q些cMBatteryPoweredMotor而不是Motorz。这些改动加入到2.0版Y件之后,销售部门很满意。随着业务的不断发展,不久之后光驱动的发动机出C。销售部门要求光驱动发动机需要一定光能才能运转,光能以流明(LumenQ度量。这个信息对客户很重要,因ؓ下雨或多云的天气里,某些光驱动发动机可能无法q{。销售部门要求ؓ软g增加对光驱动发动机的支持Q所以要定义一个新的行为?br /><br />  行ؓ3Q查询光驱动发动够正常运转所需要的最流明数Q发动机q回一个整数?br /><br />  再定义一个抽象类q把行ؓ3转换成JavaҎQ代码如下:<br /><br />public abstract SolarPoweredMotor extends Motor{<br /><br />abstract public int getLumensToOperate();<br /><br />}<br /><br />  如图1所C,SolarPoweredMotor和BatteryPoweredMotor都从Motor抽象cL生。在整个软g中,90Q以上的代码以相同的方式对待所有的发动机。偶需要检查一下发动机是光驱动q是电驱动,使用instanceof实现Q代码如下:<br /><br />[color=#336600]<br /><br />if (instanceof SolarPoweredMotor){...}<br /><br />if (instanceof BatteryPoweredMotor){...}<br /><br />  无论是哪U发动机Q马力这个参数都很重要,所以在所有派生的抽象c(SolarPoweredMotor和BatteryPoweredMotorQ中QgetHorsepower()Ҏ都有效?br /><br />  现在销售部门又有了一U新的发动机Q它是一U既有电驱动又有光驱动的双重驱动发动机。光驱动和电驱动的行为本w没有变化,但新的发动机同时支持两种行ؓ。在考虑如何定义新型的光电驱动发动机Ӟ接口和抽象类的差别开始显C出来了。新的目标是在增加新型发动机的前提下量改动代码。因Z光驱动发动机、电驱动发动机有关的代码已经q全面的试Q不存在已知的Bug。ؓ了增加光电驱动发动机Q要定义一个新的SolarBatteryPowered抽象cR如果让SolarBatteryPowered从Motor抽象cL生,SolarBatteryPowered不支持针对光驱动发动机和电驱动发动机的instanceof操作。也是_如果查询一个光电驱动的发动机是光驱动的Q还是电驱动的,得到的答案是Q都不是?br /><br />  如果?SolarBatteryPowered从SolarPoweredMotorQ或BatteryPoweredMotorQ抽象类zQ类似的问题也会出现QSolarBatteryPowered不支持针对BatteryPoweredMotorQ或SolarPoweredMotorQ的 instanceof操作。从行ؓ上看Q光电驱动的发动机必d时从两个抽象cL生,但Java语言不允许多重ѝ之所以会出现q个问题Q根本的原因在于使用抽象cM仅意味着定义特定的行为,而且意味着定义实现的模式。也是_应该定义一个发动机如何获得行ؓ的模型,而不仅仅是声明发动机h某一个行为?br /><br />通过接口建立行ؓ模型<br /><br />  如果用接口来建立行ؓ模型Q就可以避免隐含地规定实现模式。例如,前面的几个行为改用接口定义如下?br /><br />  行ؓ1Q?br /><br />public interface Motor(){<br /><br />public int getHorsepower();<br /><br />}<br /><br />行ؓ2Q?br /><br />public interface BatteryPoweredMotor extends Motor(){<br /><br />public int getTimeToRecharge();<br /><br />}<br /><br />行ؓ3Q?br /><br />public interface SolarPoweredMotor extends Motor{<br /><br />abstract public int getLumensToOperate();<br /><br />}<br /><br />  现在光电驱动的发动机可以描述为:<br />public DualPoweredMotor implements SolarPoweredMotor, BatteryPoweredMotor{}<br /><br />  DualPoweredMotor只承行为定义,而不是行为的实现模式Q如?所C?br /><br />  在用接口的同时仍旧可以使用抽象c,不过q时抽象cȝ作用是实现行为,而不是定义行为。只要实现行为的c遵从接口定义,即它改变了父抽象类Q也不用改变其它代码与之交互的方式。特别是对于公用的实C码,抽象cL它的优点。抽象类能够保证实现的层ơ关p,避免代码重复。然而,即在用抽象类的场合,也不要忽视通过接口定义行ؓ模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往Dq于复杂的承关p,而通过接口定义行ؓ能够更有效地分离行ؓ与实玎ͼZ码的l护和修改带来方ѝ?img src ="http://m.tkk7.com/jsdk999/aggbug/71274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jsdk999/" target="_blank">WindDC</a> 2006-09-22 11:32 <a href="http://m.tkk7.com/jsdk999/archive/2006/09/22/71274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://maomi90.com" target="_blank">պƵ</a>| <a href="http://xp189.com" target="_blank">պһƬѹۿ</a>| <a href="http://xiaomaomi8.com" target="_blank">þþƷӰѶ</a>| <a href="http://szclinic.com" target="_blank">鸣ۺĻһƵ1 </a>| <a href="http://zz773.com" target="_blank">޹պһ</a>| <a href="http://jujiamy.com" target="_blank">1000ڵƵۿ</a>| <a href="http://bdykdq.com" target="_blank">޳ɫӰԺ</a>| <a href="http://www73234.com" target="_blank">ĻӰӰԺ߹ۿƵ </a>| <a href="http://zaideqin.com" target="_blank">Ʒ޾Ʒˬˬ</a>| <a href="http://cz655.com" target="_blank">׾Ʒר</a>| <a href="http://caicpa.com" target="_blank">ۺС˵</a>| <a href="http://bjlfggcm.com" target="_blank">avר߹ۿ</a>| <a href="http://newbuybay.com" target="_blank">һëƬڲ</a>| <a href="http://91tapp.com" target="_blank">ĻþþƷ1</a>| <a href="http://0967c.com" target="_blank">ѹۿ</a>| <a href="http://doubaye.com" target="_blank">޹˽ӰԺ</a>| <a href="http://www6661126.com" target="_blank">鶹һѲվ</a>| <a href="http://nxeea.com" target="_blank">avҹӰ߹ۿ</a>| <a href="http://jioupin.com" target="_blank">ҹɫ˽ӰԺ߹ۿ</a>| <a href="http://527352.com" target="_blank">www.avѹۿ</a>| <a href="http://yuase.com" target="_blank">޾þþþþ</a>| <a href="http://qihongxia.com" target="_blank">99ee6ȾþѾƷ6</a>| <a href="http://xingdagx.com" target="_blank"> ŷ У԰</a>| <a href="http://rbthy.com" target="_blank">aëƬ18ϹۿƷ</a>| <a href="http://blbkl.com" target="_blank">99ƷƷ</a>| <a href="http://166sb.com" target="_blank">Ļɫ</a>| <a href="http://7a37.com" target="_blank">aëƬav</a>| <a href="http://gg596gg.com" target="_blank">ˬִ̼վ</a>| <a href="http://600c20.com" target="_blank">þˮav뾫Ʒ鶹</a>| <a href="http://bjbf99.com" target="_blank">91߾Ʒ</a>| <a href="http://mqiuxia66.com" target="_blank">ɫþƷƵ</a>| <a href="http://aqd1987.com" target="_blank">޳AVƬ߲</a>| <a href="http://0359jgyy.com" target="_blank">þۺAVѹۿ</a>| <a href="http://jomashopcn.com" target="_blank">˳ˬһ</a>| <a href="http://mogo321.com" target="_blank">޸߹ۿ</a>| <a href="http://pjwys.com" target="_blank">12345Ƶ</a>| <a href="http://ttvv77.com" target="_blank">һaƬ</a>| <a href="http://cc45987.com" target="_blank">ŷղ</a>| <a href="http://91ggan.com" target="_blank">Ʒ_˳</a>| <a href="http://732r.com" target="_blank">57PAO˹Ƶ</a>| <a href="http://by11gun.com" target="_blank">ȫһһëƬѿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>