Groovy and Grails Recipes翻译之旅——第4章 面向对象的Groovy(3)

4.3.           什么是类型别名(Type Aliasing),如何使用它?

如果在Java中使用相同类名的2个类,(naming conflicts)至少有一个类必须使用全名(完全限定名,fully qualified name),包括包名和类名以避免命名冲突,例如java.util.Datejava.sql.Date。而Groovy中您可使用as关键字,它能在首次引入类时给该类起别名,如清单4.6所示。

 

清单4.6 Groovy类型别名

import java.sql.Date as SQLDate

def date = new Date()

def sqlDate = new SQLDate(date.time)

assert date == sqlDate

 

别名机制另一个有趣的功能就是改变其他类库的类的行为(behavior)。您可编写一个子类,它继承于其他类库的某个类,并且重载其中的某个方法。然而,当引入超类时,子类给该父类另起别名,而子类名却与父类相同,伪装成父类,但行为不同。如果已有代码使用该父类,这样,代码不需任何修改的情况下就能使用新的子类。下面的例子可以很好的解释这个问题。

假设您有第三方类库的HelloWorld类,并且不能访问其源代码。该类输出英文版的Hello World,见清单4.7

 

清单4.7 原版本HelloWorld

package library

public class HelloWorld{

  public String sayHello(){

    return 'Hello World'

  }

}

 

调用清单4.7HelloWorld类的示例代码大致如下:

 

import library.HelloWorld

 

HelloWorld helloWorld = new HelloWorld()

assert helloWorld.sayHello() == 'Hello World'

 

现在,假设您想改变该类的行为,使其输入西班牙文版的Hello WorldHola Mundo),并且不能修改原版本类或代码。清单4.8演示了如何通过使用as关键来实现。

清单4.8 使用Groovy别名机制后的HelloWorld

import library.HelloWorld as HelloWorldEnglish

class HelloWorld extends HelloWorldEnglish {

  public String sayHello(){

    return 'Hola Mundo'

  }

}

HelloWorld helloWorld = new HelloWorld()

assert helloWorld.sayHello() == 'Hola Mundo'

你可能感兴趣的:(sql,grails,groovy)