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

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

OO 
阅读更多
与数据类型定义相关的,还有一些小问题,这里再讨论一下。
 
1、final修饰符
 
datatype作为校验的依据,其实分为两个部分:是否存在某一特定名称与类型的变量;变量是否符合一组check条件。因此,任何数据,只要能够事实上通过abc类型的校验条件,就可以算作是abc类的数据,并不需要在定义中显式的声明为as abc云云。这个语法设定,并没有考虑到一种特殊条件——满足条件,但是有多余数据的情况。因此我们需要在datatype之前,再加上final修饰符,这就意味着,如果有数据通过了所有的判据,但是还有多余的变量,我们将认为这个数据并不属于abc类型。
 
与java中的final有区别的是,final并不是一个拒绝代码重用的手段。假设一个新的数据类型ddd,通过as重用了abc类型的判断条件,当一个实际为ddd类型的数据被校验时,它将只是ddd型数据,而非abc型数据。而如果我们取消abc定义时的final修饰符,则这个数据将同时算做abc型与ddd型。
 
2、数据转型
 
如果一个数据原本是ddd型的,而ddd型同时又是满足abc型的判据的,那么这个ddd型数据,可以自由的转型为abc型,无需任何显式的声明。但是,另外一种转型需求,也是存在的。
 

datatype Point{

    double x;
    double y;   
}

 

Point是一个平面几何中的一个点。当我们希望建立一套“复平面”几何的时候,其实是相当容易的。

 

datatype Complex{

    double real;

    double img;
}

 

Point与Complex是如此的相似,那么能够处理Point的Method,能不能处理Complex呢?

 

我们需要定义两个个动态转型规则:

dynamic_cast<Point,Complex>{

    x->real;

    y->img;

}  Point_Complex;

 

dynamic_cast<Complex,Point>{

    real->x;

    img->y;

}  Complex_Point;

 

这样,当我们写下:(Point_Complex)p1;的时候,我们就能得到一个Complex型的数据了。

而当我们写下:(Complex_Point)c1;的时候,我们就能得到一个Point型的数据了。

 

(未完待续)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics