雅典之夏的小站
知人者智 自知者明 Fighting!!
可以自由的从MP3机上下载音乐文件,而且大大提升了传输的速度,
首先从:
http://bbs.imp3.net/attachment.php?aid=99466
下载一个iriver的插件

运行TC--->菜单点配置--->插件---->文件系统插件点设置--->点添加新插件,这时候就添加下边附件中的插件就行了。

然后软件运行时的界面就和我们的IMM差不多,不过功能更强大,安装只占4.5MB。
不过要想访问MP3(有驱无驱都好使)请点主菜单栏下面的盘符栏的网上邻居
就会找到,然后一切OK
posted @ 2006-02-24 17:52 rkind 阅读(519) | 评论 (0)编辑 收藏
一直以来,认为实现这种上传要比下载简单的多,可是等到真正去实现的时候,才发现原来挺麻烦的
遇到的问题有:
      1中文文件名的问题。

      2文件没有下载提示直接就打开,包括rar的。

就这么两个小问题却让我花了三天的时间,不得不汗一下我的效率。

      首先来说中文链接的问题,tomcat默认是不支持中文URL的,但是可以在Sever.xml中把 Connector 的属性加上一条:   URIEncoding="GBK";然后在传递之前,链接的中文还要先encode一下
例如:java.net.URLEncoder.encode(“测试.txt”);   这样中文就会变成%D%F之类的,总之就可以正常传递了。
      而关于点击文件直接就打开了是比较郁闷,查找了些资料,也试了网上的一些方法,一直不行
,最后采用的文件流的方式,才顺利解决。代码大致如下:


while(rs.next()){
  try{
  OutputStream o=response.getOutputStream();
  byte b[]=new byte[500];
  filename=rs.getString("filename");//rs.为从数据库查找到的结果集
  filename=java.net.URLEncoder.encode(filename).trim();
  File file=new File("d:/upload/20060221/",rs.getString("filename"));
  //
  response.setHeader("Content-Disposition","attachment; filename="+filename); 
  response.setContentType("APPLICATION/OCTET-STREAM");
     long fileLength=file.length();
     String length=String.valueOf(fileLength);
     response.setHeader("Content_Length",length);
     java.io.FileInputStream in = new java.io.FileInputStream(file);
  int n=0;
   while ((n=in.read(b)) != -1) {
     o.write(b,0,n);
   }
   in.close();
  o.close();
  }catch(Exception e){
   System.out.print(e);
  }
 }
 rs.close();
       
这样的话,中英文文件都能正常下载并使用,但是中文文件用Ie直接下载下来后文件名还是乱码,用下载工具则一切正常。
posted @ 2006-02-21 15:58 rkind 阅读(253) | 评论 (0)编辑 收藏

以前装过sql server,后来删掉。现在重装,却出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误。无法进行下去。

参考网上资料,总算搞定。步骤是:

1)添加/删除程序中彻底删除sql server。

2)将没有删除的sql server目录也删除掉。

3)打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目。

4)删除注册表中跟sql server相关的键。

其实估计只要做第3步就可以搞定,这样就可以清除安装暂挂项目。自己是先走了1,2,4,最后做了3才搞定。所以估计3才是最关键的。

ME too

posted @ 2006-02-21 09:47 rkind 阅读(164) | 评论 (0)编辑 收藏

前两天要把我们信息平台上的tomcat4加为服务,
         
         刚一开始就想先迁移到tomcat5上可是迁移以后数据库总是联不上,郁闷了好久。
后来又从网上找直接把tomcat4加为服务的脚本,尝试了几次,总是找不到tomcat的目录,原来批处理文件里面不识别空格,把文件名改了下,服务算是加上了,可启动时却总是出错误,又重新装了一次tomcat4.1.3,发现装完以后在 /bin的文件夹里,根本就没有tomcat.exe,着实有些郁闷,看来原来那个tomcat.exe肯定是从tomcat5里面拷过来的。不经意间又装了一遍tomcat4.1.3,发现有一个选项(NT service xp/2000;only)郁闷啊,这不是直接就可以加为服务吗,晕死了过去。。。。

       这说明我还是太粗心了,装过那么多回tomcat,也想过这个ntservice,怎么就记过这就是加成服务的呢
,我说网上相关的东西怎么这么少,原来是apahce已经带了这个功能。

posted @ 2006-02-14 11:17 rkind 阅读(274) | 评论 (0)编辑 收藏

把以下代码粘贴到首页中,就可以从counter.txt中读取访问量。
一定要注意路径的问题,刚开始直接用counter.txt,结果总是找不到文件,而且用绝对路径也不行,
但是用/counter.txt就没有问题
<%!
int number=0;
    synchronized void countPeople(){
        if(number==0){
            try{
                FileInputStream in=new FileInputStream("/counter.txt");
                DataInputStream dataIn=new DataInputStream(in);
                number=dataIn.readInt();
                number++;
                in.close();
                dataIn.close();
            }catch(FileNotFoundException e){
    
                number++;
                try{
                    FileOutputStream out=new FileOutputStream("/counter.txt");
                    DataOutputStream dataOut=new DataOutputStream(out);
                    dataOut.writeInt(number);
                    out.close();
                    dataOut.close();
                }catch(IOException ffe){
                    System.out.print(ffe);
                }
            }catch(IOException ee){
   System.out.println(ee);
            }
            }else{
            number++;
            try{
                FileOutputStream out=new FileOutputStream("/counter.txt");
                DataOutputStream dataOut=new DataOutputStream(out);
                dataOut.writeInt(number);
                out.close();
                dataOut.close();
            }catch(FileNotFoundException e){
    System.out.println(e);
   }
            catch(IOException e){
    System.out.println(e);
   }

        }
    }

%>
<% countPeople();%>

posted @ 2006-01-19 11:26 rkind 阅读(322) | 评论 (0)编辑 收藏
我们在ie地址栏搜索时,页面老是自动进入265导航网站,一看就是垃圾网站,你还弄不掉,烦死人了,教大家一个方法,可以弄掉265!!!
1、首先进入C:\WINDOWS\system32\drivers找到ETC这个文件夹
2、将ETC文件夹里面的hosts用记事本打开
3、在最后一栏上加上127.0.0.1 auto.search.msn.com
4、保存退出即可。

你试试,就清静多了


posted @ 2006-01-18 15:37 rkind 阅读(505) | 评论 (0)编辑 收藏
您的人格类型是: ISFJ(内向,感觉,情感,判断)

您的工作中的优势:
  ◆ 能够很好地集中精力,关注焦点
  ◆ 很强的工作伦理,工作努力而且很负责任
  ◆ 良好的协作技巧,能和别人建立和谐友好的关系
  ◆ 讲求实效的工作态度,办事方法切实可行
  ◆ 十分关注细节,能够准确把握事实
  ◆ 乐于助人,给同事和下属职员的工作提供支持和帮助
  ◆ 了解公司(或者组织)的经历,能够很好地维护公司的传统
  ◆ 杰出的组织才能
  ◆ 愿意在传统的机构中工作,而且兢兢业业,不遗余力
  ◆ 能够连续工作,对于相同的工作不会感到厌倦
  ◆ 非常强的责任意识,别人可以信赖
  ◆ 喜欢运用固定的办事程序,尊重别人的地位和能力
  ◆ 通情达理,视角现实

您工作中可能存在的不足:
  ◆ 可能会低估自己的能力,难于坚持维护自己的需要和利益
  ◆ 不愿意尝试新的和未经考验的观点和想法
  ◆ 对反对意见过于敏感,在紧张的环境中容易感到压抑
  ◆ 可能只关注眼前的细节,而对整体和未来不太重视
  ◆ 倾向于同时投入到过多的工作任务中去
  ◆ 难以适应新的情况,或者在不同工作任务中间来回切换时有困难
  ◆ 易于被需要同时解决太多的任务或者项目时会弄得无所适从
  ◆ 如果自己得不到充分的重视和赞赏,可能会感到灰心丧气
  ◆ 一旦做出决定,就不愿意从头考虑同一个问题
posted @ 2006-01-10 17:10 rkind 阅读(160) | 评论 (0)编辑 收藏

<form action="submit_1.html" method=post>
<input type=image src="exa.gif" name="sub1">
</form>

就是这简单

posted @ 2006-01-04 13:58 rkind 阅读(505) | 评论 (0)编辑 收藏
1、如何学习Spring?

  你可以通过下列途径学习spring:

  (1) spring下载包中doc目录下的MVC-step-by-step和sample目录下的例子都是比较好的spring开发的例子。

  (2) AppFuse集成了目前最流行的几个开源轻量级框架或者工具 Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts 。

  你可以通过AppFuse源代码来学习spring。

AppFuse网站:http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse

  (3)Spring 开发指南(夏昕)(http://www.xiaxin.net/Spring_Dev_Guide.rar)

  一本spring的入门书籍,里面介绍了反转控制和依赖注射的概念,以及spring的bean管理,spring的MVC,spring和hibernte,iBatis的结合。

  (4) spring学习的中文论坛

  SpringFramework中文论坛(http://spring.jactiongroup.net)

  Java视线论坛(http://forum.javaeye.com)的spring栏目

  2、利用Spring框架编程,console打印出log4j:WARN Please initialize the log4j system properly?

  说明你的log4j.properties没有配置。请把log4j.properties放到工程的classpath中,eclipse的classpath为bin目录,由于编译后src目录下的文件会拷贝到bin目录下,所以你可以把log4j.properties放到src目录下。

  这里给出一个log4j.properties的例子:

log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

  3、出现 java.lang.NoClassDefFoundError?

  一般情况下是由于你没有把必要的jar包放到lib中。

  比如你要采用spring和hibernate(带事务支持的话),你除了spring.jar外还需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的几个jar包。

http://www.springframework.org/download.html下载spring开发包,提供两种zip包
spring-framework-1.1.3-with-dependencies.zip和spring-framework-1.1.3.zip,我建议你下载spring-framework-1.1.3-with-dependencies.zip。这个zip解压缩后比后者多一个lib目录,其中有hibernate、j2ee、dom4j、aopalliance、jakarta-commons等常用包。

  4、java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文件?

  原因一般有两个:

  (1)该xml文件没有在classpath中。

  (2)applicationContext-hibernate.xml中的xml名字没有带包名。比如:

<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="mappingResources">
 <list>
  <value>User.hbm.xml</value>
  错,改为:
  <value>com/yz/spring/domain/User.hbm.xml</value>
 </list>
</property>
<property name="hibernateProperties">
<props>
 <prop key="hibernate.dialect"> net.sf.hibernate.dialect.MySQLDialect </prop>
 <prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

  5、org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean class?

  出现异常的原因是在application-xxx.xml中property name的错误。

  <property name="...."> 中name的名字是与bean的set方法相关的,而且要注意大小写。

  比如

public class PostManageImpl extends BaseManage implements PostManage {
 private PostDAO dao = null;
 public void setPostDAO(PostDAO postDAO){
  this.dao = postDAO;
 }
}

  那么xml的定义应该是:

<bean id="postManage" parent="txProxyTemplate">
<property name="target">
 <bean class="com.yz.spring.service.implement.PostManageImpl">
  <property name="postDAO"><ref bean="postDAO"/></property> 对
  <property name="dao"><ref bean="postDAO"/></property> 错
 </bean>
</property>
</bean>

  6、Spring中如何实现事务管理?

  首先,如果使用mysql,确定mysql为InnoDB类型。

  事务管理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的JavaBean,在该JavaBean中调用DAO,然后把该Bean的方法纳入spring的事务管理。

  比如:xml文件定义如下:

<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="userManage" parent="txProxyTemplate">
 <property name="target">
  <bean class="com.yz.spring.service.implement.UserManageImpl">
   <property name="userDAO"><ref bean="userDAO"/></property>
  </bean>
 </property>
</bean>

  com.yz.spring.service.implement.UserManageImpl就是我们的实现商业逻辑的JavaBean。我们通过parent元素声明其事务支持。

  7、如何管理Spring框架下更多的JavaBean?

  JavaBean越多,spring配置文件就越大,这样不易维护。为了使配置清晰,我们可以将JavaBean分类管理,放在不同的配置文件中。 应用启动时将所有的xml同时加载。

  比如:

  DAO层的JavaBean放到applicationContext-hibernate.xml中,商业逻辑层的JavaBean放到applicationContext-service.xml中。然后启动类中调用以下代码载入所有的ApplicationContext。

String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",
"com/yz/spring/service/applicationContext-service.xml"};
ctx = new ClassPathXmlApplicationContext(paths);

  8、web应用中如何加载ApplicationContext?

  可以通过定义web.xml,由web容器自动加载。

<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-hibernate.xml</param-value>
<param-value>/WEB-INF/applicationContext-service.xml</param-value>
</context-param>

  9、在spring中如何配置的log4j?

  在web.xml中加入以下代码即可。

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

  10、Spring框架入门的编程问题解决了,我该如何更深地领会Spring框架呢?

  这两本书你该去看看。这两本书是由Spring的作者Rod Johnson编写的。

Expert One on one J2EE Design and Development
Expert One on one J2EE Development Without EJB

  你也该看看martinfowler的Inversion of Control Containers and the Dependency Injection pattern。

http://www.martinfowler.com/articles/injection.html
 
  再好好研读一下spring的文档。

http://www.jactiongroup.net/reference/html/index.html(中文版,未全部翻译)

  还有就是多实践吧。
posted @ 2005-12-06 17:54 rkind 阅读(201) | 评论 (0)编辑 收藏

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。
其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。
一、理解抽象类
abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
二、从语法定义层面看abstract class和interface
在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下:

abstract class Demo { 
 abstract void method1(); 
 abstract void method2(); 
 … 
}


使用interface的方式定义Demo抽象类的方式如下:

interface Demo { 
 void method1(); 
 void method2(); 
 … 
}


在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。
从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。
在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。
三、从设计理念层面看abstract class和interface
上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本文将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:

使用abstract class方式定义Door: 

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
} 

使用interface方式定义Door: 

interface Door { 
 void open(); 
 void close(); 
}


其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。
如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。
解决方案一:
简单的在Door的定义中增加一个alarm方法,如下:

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
 abstract void alarm(); 
} 

  
或者 

interface Door { 
 void open(); 
 void close(); 
 void alarm(); 
}


那么具有报警功能的AlarmDoor的定义方式如下:

class AlarmDoor extends Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
} 

  
或者 

class AlarmDoor implements Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
}


这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。
解决方案二:
既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。
显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。
如果两个概念都使用interface方式来定义,那么就反映出两个问题:
1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?
2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。
如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示:

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
} 
interface Alarm { 
 void alarm(); 
} 
class AlarmDoor extends Door implements Alarm { 
 void open() { … } 
 void close() { … } 
    void alarm() { … } 
}


这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。
abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会

posted @ 2005-12-06 11:03 rkind 阅读(218) | 评论 (0)编辑 收藏
仅列出标题
共8页: 上一页 1 2 3 4 5 6 7 8 下一页