|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你通过从书的数量和开发周期及运行速度来证明:net网页编程和ruby要比java简单。
这个成绩的实质是若将渣滓丢进单个渣滓筒,现实上是未经分类的。但在今后,某些特别的信息必需恢复,以便对渣滓准确地回类。在最入手下手的办理计划中,RTTI饰演了关头的脚色(详见第11章)。
这并非一种一般的计划,由于它增添了一个新的限定。恰是这个限定使成绩变得十分风趣——它更象我们在事情中碰着的那些十分贫苦的成绩。这个分外的限定是:渣滓到达渣滓接纳站时,它们全都是夹杂在一同的。程序必需为那些渣滓的分类定出一个模子。这恰是RTTI发扬感化的中央:我们有大批不出名的渣滓,程序将准确判别出它们所属的范例。
- //:RecycleA.java
- //RecyclingwithRTTI
- packagec16.recyclea;
- importjava.util.*;
- importjava.io.*;
- abstractclassTrash{
- privatedoubleweight;
- Trash(doublewt){weight=wt;}
- abstractdoublevalue();
- doubleweight(){returnweight;}
- //SumsthevalueofTrashinabin:
- staticvoidsumValue(Vectorbin){
- Enumeratione=bin.elements();
- doubleval=0.0f;
- while(e.hasMoreElements()){
- //OnekindofRTTI:
- //Adynamically-checkedcast
- Trasht=(Trash)e.nextElement();
- //Polymorphisminaction:
- val+=t.weight()*t.value();
- System.out.println(
- "weightof"+
- //UsingRTTItogettype
- //informationabouttheclass:
- t.getClass().getName()+
- "="+t.weight());
- }
- System.out.println("Totalvalue="+val);
- }
- }
- classAluminumextendsTrash{
- staticdoubleval=1.67f;
- Aluminum(doublewt){super(wt);}
- doublevalue(){returnval;}
- staticvoidvalue(doublenewval){
- val=newval;
- }
- }
- classPaperextendsTrash{
- staticdoubleval=0.10f;
- Paper(doublewt){super(wt);}
- doublevalue(){returnval;}
- staticvoidvalue(doublenewval){
- val=newval;
- }
- }
- classGlassextendsTrash{
- staticdoubleval=0.23f;
- Glass(doublewt){super(wt);}
- doublevalue(){returnval;}
- staticvoidvalue(doublenewval){
- val=newval;
- }
- }
- publicclassRecycleA{
- publicstaticvoidmain(String[]args){
- Vectorbin=newVector();
- //FilluptheTrashbin:
- for(inti=0;i<30;i++)
- switch((int)(Math.random()*3)){
- case0:
- bin.addElement(new
- Aluminum(Math.random()*100));
- break;
- case1:
- bin.addElement(new
- Paper(Math.random()*100));
- break;
- case2:
- bin.addElement(new
- Glass(Math.random()*100));
- }
- Vector
- glassBin=newVector(),
- paperBin=newVector(),
- alBin=newVector();
- Enumerationsorter=bin.elements();
- //SorttheTrash:
- while(sorter.hasMoreElements()){
- Objectt=sorter.nextElement();
- //RTTItoshowclassmembership:
- if(tinstanceofAluminum)
- alBin.addElement(t);
- if(tinstanceofPaper)
- paperBin.addElement(t);
- if(tinstanceofGlass)
- glassBin.addElement(t);
- }
- Trash.sumValue(alBin);
- Trash.sumValue(paperBin);
- Trash.sumValue(glassBin);
- Trash.sumValue(bin);
- }
- }///:~
复制代码
要注重的第一个中央是package语句:
packagec16.recyclea;
这意味着在本书接纳的源码目次中,这个文件会被置进从c16(代表第16章的程序)分付出来的recyclea子目次中。第17章的解包工具会卖力将其置进准确的子目次。之以是要如许做,是由于本章会屡次改写这个特定的例子;它的每一个版本城市置进本人的“包”(package)内,制止类名的抵触。
个中创立了几个Vector对象,用于包容Trash句柄。固然,Vector实践包容的是Object(对象),以是它们终极可以包容任何工具。之以是要它们包容Trash(大概从Trash衍生出来的其他工具),独一的来由是我们必要审慎地制止放进除Trash之外的其他任何工具。假如真的把某些“毛病”的工具置进Vector,那末不会在编译期失掉堕落或告诫提醒——只能经由过程运转期的一个背例晓得本人已犯了毛病。
Trash句柄到场后,它们会丧失本人的特定标识信息,只会成为复杂的Object句柄(上溯外型)。但是,因为存在多形性的要素,以是在我们经由过程Enumerationsorter挪用静态绑定办法时,一旦了局Object已外型回Trash,仍旧会产生准确的举动。sumValue()也用一个Enumeration对Vector中的每一个对象举行操纵。
外表上持,先把Trash的范例上溯外型到一个汇合包容基本范例的句柄,再回过火从头下溯外型,这仿佛是一种十分愚昧的做法。为何不但是一入手下手就将渣滓置进得当的容器里呢?(现实上,这恰是扒开“接纳”一团迷雾的关头)。在这个程序中,我们很简单就能够换成这类做法,但在某些情形下,体系的布局及天真性都能从下溯外型中失掉极年夜的优点。
该程序已满意了计划的初志:它可以一般事情!只需这是个一次性的计划,就会显得十分杰出。可是,真正有效的程序应当可以在任什么时候候办理成绩。以是必需问本人如许一个成绩:“假如情形产生了变更,它还能事情吗?”举个例子来讲,厚纸板如今是一种十分有代价的可接纳物品,那末怎样把它集成到体系中呢(出格是程序很年夜很庞大的时分)?因为后面在switch语句中的范例反省编码大概分布于全部程序,以是每次到场一种新范例时,都必需找到一切那些编码。若失慎漏掉一个,编译器除指出存在一个毛病以外,不克不及再供应任何有代价的匡助。
RTTI在这里利用不妥的关头是“每品种型都举行了测试”。假如因为范例的子集必要特别的看待,以是只寻觅谁人子集,那末情形就会变得好一些。但假设在一个switch语句中查找每品种型,那末极可能错过一个重点,使终极的代码很难保护。鄙人一节中,人人会进修怎样慢慢对这个程序举行改善,使其显得愈来愈天真。这是在程序计划中一种十分成心义的例子。
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。 |
|