`
庄表伟
  • 浏览: 1152342 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

敲响OO时代的丧钟——一种新的语言(5)

阅读更多
三、Channel的定义
关于Channel,我一时找不到好的中文来称呼它。当然,在我思考的时候,我的心里面想的是中文“管道”。但是管道这个词我一直觉得不太好,所以也没有深入想,就直接起个英文名词Channel算了。先看一下Channel是如何定义的。
 
channel UserChannel<datatype User user>{
    public String getUserName(){
        return user.name;
    }
    public void setUserName(String name){
        user.name=name;
    }
    public int getAge(){
        return user.age;
    }
    public void setAge(int age){
        user.age=age;
    }
}
 
这段代码很像一个java的POJO,但是,又有些诡异的地方。让我来慢慢解释。
1、channel:这是一个关键字,用来定义一个channel的,就像datatye一样。
2、<datatype User user>:这是channel操作的范围定义。一个channel,与一个class,最大的区别在于,channel没有自己的内部属性(数据成员)。因此,一个channel中所有能够操作的数据,都在<>中定义。
3、在<>中,还可以定义<channel OtherChannel other>,这样就可以将两个连接channel连接起来。当然,通过逗号分割,我们还可以定义<datatype User user,channel OtherChannel other>这样的连接关系。这样在channel中,能够操作的就是user与other。
4、channel中的所有方法定义,都可以按照之前对于方法定义中描述的那样,追加check与test部分。
5、channel之间没有继承关系,只有连接关系。假设我们需要扩展UserChannel的功能,除了直接修改他的源代码之外,我们还可以定义一个新的channel。就像下面这样:
channel ExtendUserChannel<channel UserChannel uc>{
    public boolean isYoung(){
        return uc.getAge()<30;
    }
    public boolean isOld(){
        return uc.getAge()>60;
    }
}
 
这样的一个ExtendUserChannel,并不提供原本UserChannel提供的那些方法,如果希望ExtendUserChannel提供,则需要显式的编程定义(方法改名的情况下),或者以如下方式再次声明:
 
public String getUserName();
public void setUserName(String name);
关于channel定义还有两个关键字需要介绍:contract与event。这两个关键字,我明天就会描述出来的。
 
(未完待续)
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics