[疑难] 关于D的3个疑问
ant-man
2007-09-22
谢谢,成功解决第一个和三个问题... |
|
Colorful
2007-09-22
关于第二个问题,我做了些试验。
初步判断,这个问题是跟第三个问题是类似的。 均是关于变量初始化和编译时,运行时的问题。 看下面这段代码(为了说明问题,采用了楼主的相关类,其实下面的继承对于该问题来说没有必要): public class Layout(T){} public class Frame{} public class MyFrame : Frame { auto format = new Layout!(char); } 这段代码,在DMD 2.004下,编译器报的错跟楼主差不多。 再来看下面的代码: public class Layout(T){} public class Frame{} public class MyFrame : Frame { this(){auto format = new Layout!(char);} //或者采用成员函数也行,因为从分配内存的角度看是一致的。 // void SomeMethod(){auto format = new Layout!(char);} } 上面的代码编译很成功。 第三个问题在于初始化在module级别,这个问题则是class级别。 PS:通常按照常理来说 public class MyFrame : Frame { auto format = new Layout!(char); }这段代码应该被编译器优化为public class MyFrame : Frame { Layout!(char) format; this(){format = new Layout!(char);} } |
|
Colorful
2007-09-22
再来举个非泛型的例子。
public class MyFrame : Frame { Frame frame = new Frame(); } 看,这段代码跟第三个问题很相似,只是范围不同而已。 此外,就是模块没有this,只有static this罢了。 |
|
oldrev
2007-09-22
public class MyFrame : Frame { Frame frame = new Frame(); } 这是无论如何不能接受的,new Frame() 的执行时机不能确定 |
|
Colorful
2007-09-22
oldrev 写道 public class MyFrame : Frame { Frame frame = new Frame(); } 这是无论如何不能接受的,new Frame() 的执行时机不能确定 事实上,这段代码压根就不能编译通过。 但是,假如我们认为它能够通过编译,也就是语义等同于 public class MyFrame : Frame { Frame frame; this(){frame = new Frame();} } 它的执行时机是确定的: 1.首先执行super()来初始化父类Frame 2.然后执行this()来执行其中的代码内容,也就是再初始化它的成员frame. 这段代码可以说明问题: void main() { MyFrame myFrame = new MyFrame(); myFrame.Show(); } public class Frame{ public int Length; } public class MyFrame : Frame { Frame frame; this() { frame = new Frame(); frame.Length = 10; } void Show() { printf("%d\n", frame.Length); printf("%d\n", this.Length); printf("%d\n", super.Length); } } |
|
oldrev
2007-09-23
Colorful 写道 oldrev 写道 public class MyFrame : Frame { Frame frame = new Frame(); } 这是无论如何不能接受的,new Frame() 的执行时机不能确定 事实上,这段代码压根就不能编译通过。 但是,假如我们认为它能够通过编译,也就是语义等同于 public class MyFrame : Frame { Frame frame; this(){frame = new Frame();} } 它的执行时机是确定的: 1.首先执行super()来初始化父类Frame 2.然后执行this()来执行其中的代码内容,也就是再初始化它的成员frame. 这段代码可以说明问题: void main() { MyFrame myFrame = new MyFrame(); myFrame.Show(); } public class Frame{ public int Length; } public class MyFrame : Frame { Frame frame; this() { frame = new Frame(); frame.Length = 10; } void Show() { printf("%d\n", frame.Length); printf("%d\n", this.Length); printf("%d\n", super.Length); } } 如果 MyFrame 已经有了 ctor 的话 new Frame() 的执行应该在 ctor 之前还是之后,MyFrame 成员的初始化顺序如何决定?任何不确定的因素都是不可接受的。 |
|
Colorful
2007-09-23
我的示例代码,MyFrame已经定义了构造函数。
public class MyFrame : Frame { auto format = new Frame(); } 这种用法编译器本身便不支持,或者说还没进行内联优化。所以我给出的是在语义相同的情况下,带构造器的代码示例。 通常如果做内联优化,上述代码new Frame的执行时机在构造器中,但是成员的初始化顺序的确是个问题。 |
相关讨论
相关资源推荐
- Web程序员简历模板,以及如何写一篇优秀的简历
- 推荐:45个优秀的免费web模板
- dropwizard-marionette:基于 Dropwizard 和 Marionette 的模板 Web 应用程序
- 毕业设计So Easy:Java Web图书推荐系统平台
- 分享10 个开源免费且优秀的后台管理系统模板
- Micro:一个用于 Web 的微型 CMS
- 12套 Axure 模板,非常漂亮的中后台原型,可以直接套用在OA、CRM更web系统上。
- 三种风格web前端HTML5模板下载
- MaterialWebAppTemplate:一个 Material WebApp 模板 - 修改简单,使用更少的 javascript
- Bootstrap优秀模板-INSPINIA.2.9.2