2013-01-04 70 views
3

我正在阅读“The D Programming Language”一书。它讲述的是内在的阶级。访问外部类

class Outer{ 
    int x; 

    this(){ 
     x = 99; 
     new Inner; 
    } 

    class Inner{ 
     int x; 

     this(){ 
      x = 5; 
      writeln("Inner x = ", x, "; Outer x = ", this.outer.x); 
     } 
    } 
} 

正如本书所述,为了能够访问类Outer的x,我需要使用this.outer.x。但令人困惑的是,“Outer”类的名字变成小写“outer”。使用正常的类名“Outer”,编译器会给出错误消息。这就好像编译器决定你需要使用什么名称和力量来使用它生成的名称。

我的问题是,当我将类“Outer”重命名为“bLaH”时,现在我无法再使用外部类了。

class bLaH{ 
    int x; 

    this(){ 
     x = 99; 
     new Inner; 
    } 

    class Inner{ 
     int x; 

     this(){ 
      x = 5; 
      writeln("Inner x = ", x, "; Outer x = ", this.bLaH.x); 
     } 
    } 
} 

访问外部类时使用什么名字并不明显。现在第一个字母是小写,但编译器说“test1.bLaH”没有定义。 (文件名是test1.d)

如果我通过认为可能编译器将外部类的名称转换为全部小写字母来将“this.bLaH”转换为“this.blah”,这次编译器会说“未定义的变量”胡说'。”

在这个语言中是否有设计错误?作为一名程序员,我不喜欢这种由编译器完成的名称转换。

我在Windows XP上,DMD版本是2.060。

回答

12

outer是一个关键字。这就像super或其他什么。一个类总是嵌套在一个一个类中,所以关键字outer引用该类。

http://dlang.org/class.html#nested

在这里你可以找到outer实际上是一个性质。

+0

谢谢。我继续阅读,在“静态嵌套类”部分,作者突然说“神奇的属性”,然后我就明白了。干杯。 – tcak