没有Rails Java程序员如何使用Ruby

http://tech.ddvip.com   2008年01月18日    社区交流

内容摘要:Ruby on Rails仅是使Ruby成为伟大的一个因素,这就象EJB仅是Java企业平台的一个组成部分一样。本文将带你一同讨论,作为一名Java开发者,仅利用Ruby自身所能够实现的功能。

  十一、多态性

  因为Ruby是一种动态类型化语言,所以它不要求接口。其实,接口的力量完全存在于Ruby中,只是以一种更为灵活的方式存在而已。在Ruby中,有一个被昵称为“duck typing”的东西,借助于它,在Ruby中的多态性其实成了一种匹配方法名的问题。下面让我们比较一下Ruby和Java语言中的多态性实现。

  (一) Java中的多态性

  在Java语言中,展示多态性力量的方法之一是,声明一个接口类型并且让其它类型实现这个接口。然后,你可以把实现对象参考为这种接口类型并且调用在这个接口上的任何方法。作为一个例子,在列表13中,我定义了一个简单接口Filter:

  列表13.一个简单Java接口

package com.vanward.filter;
public interface Filter {
boolean applyFilter(String value);
}

  在列表14中,我定义了一个实现类,叫RegexPackageFilter,它使用一个正规表达式来实现过滤功能:

  列表14.RegexPackageFilter实现了Filter

package com.vanward.filter.impl;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import com.vanward.filter.Filter;
public class RegexPackageFilter implements Filter {
 private String filterExpression;
 private PatternCompiler compiler;
 private PatternMatcher matcher;
 public RegexPackageFilter() {
this.compiler = new Perl5Compiler();
this.matcher = new Perl5Matcher();
 }
 public RegexPackageFilter(final String filterExpression){
this();
this.filterExpression = filterExpression;
 }
 public boolean applyFilter(final String value) {
try{
 Pattern pattrn = this.getPattern();
 return this.matcher.contains(value, pattrn);
}catch(MalformedPatternException e){
 throw new RuntimeException("Regular Expression was uncompilable " +
 e.getMessage());
}
 }
 private Pattern getPattern() throws MalformedPatternException{
return compiler.compile(this.filterExpression);
 }
}

  现在,让我们设想存在Filter接口的多个实现(例如RegexPackageFilter,一个ClassInclusionFilter类型,也许还有一个SimplePackageFilter类型)。为了实现在程序中的最大灵活性,现在,其它的对象都可以参考这个接口类型(Filter)而不是实现者(implementer),详见列表15:

责编:豆豆技术应用

正在加载评论...