`
oldrev
  • 浏览: 229900 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

mixin 模拟多继承

F# 
阅读更多
D1.0 代码
  1. /** TupleMixin 演示程序, DMD2.007/GDC0.24 测试通过
  2. Written in the D programming language 1.0
  3. 作者: oldrev
  4. Copyrights: BSD
  5. */
  6. import std.stdio;
  7. //PredT 参数的作用是让你能够在每个模板混入之前对它进行处理,
  8. //比如可以在混入前用 static assert 检查是否有特定的成员
  9. //总而言之,PredT 给你机会控制混入时的细节。
  10. template MixinTuple(alias PredT, L...)
  11. {
  12. mixin PredT!(L[0]);
  13. static if(L.length > 1)
  14. mixin MixinTuple!(PredT, L[1..$]);
  15. }
  16. // P 是所有准备当做超类的模板
  17. class Mixinable(SuperClass, P...) : SuperClass
  18. {
  19. private const string InitCode = "private void initAllMixins() {";
  20. //PredT 的一个例子,混入且产生与模板同名的 alias
  21. template MixinWithAliasPred(alias X) {
  22. mixin("mixin X!() " ~ (X.stringof)[0..$-2] ~ ";"); //去掉模板名称后的 '()'
  23. }
  24. mixin MixinTuple!(MixinWithAliasPred, P);
  25. private template MakeInitCode(TL...)
  26. {
  27. static if(TL.length == 0)
  28. const string MakeInitCode = "";
  29. else
  30. { //"HasMember" 惯用法
  31. static if(is(typeof(mixin(TL[0].stringof[0..$-2] ~ "._ctor"))))
  32. { //如果TL[0] 有 _ctor 成员函数(也就是 this()),我们就产生调用 _ctor 的代码。
  33. const string MakeInitCode = TL[0].stringof[0..$-2] ~ "._ctor();\n" ~
  34. MakeInitCode!(TL[1..$]);
  35. }
  36. else //没有 _ctor,继续递归
  37. const string MakeInitCode = MakeInitCode!(TL[1..$]);
  38. }
  39. }
  40. protected this()
  41. {
  42. mixin(MakeInitCode!(P)); //产生并执行代码调用所有模板的 this()
  43. }
  44. }
  45. /////////////////////////////////////////////////////
  46. //开始演示:
  47. /////////////////////////////////////////////////////
  48. template Policy()
  49. {
  50. this() {
  51. writefln("Policy.this()");
  52. }
  53. ~this() {
  54. writefln("Policy.~this()");
  55. }
  56. void bar(T)(T x) {
  57. writefln("bar()");
  58. }
  59. }
  60. template Policy2()
  61. {
  62. this() {
  63. writefln("Policy2.this()");
  64. }
  65. ~this() {
  66. writefln("Policy2.~this()");
  67. }
  68. void foo() { writefln("Policy2.foo"); }
  69. }
  70. class SuperBar //超类,或者叫基类
  71. {
  72. this() {
  73. writefln("SuperBar.this()");
  74. }
  75. }
  76. // Mixinable 用法演示——模拟多继承
  77. // Foo 类是组合 Policy, Policy2 和 基类 SuperBar 的结果
  78. class Foo : Mixinable!(SuperBar, Policy, Policy2)
  79. {
  80. this() {
  81. writefln("Foo.this()");
  82. }
  83. void foo() { writefln("Foo.foo"); }
  84. ~this() {
  85. writefln("Foo.~this()");
  86. }
  87. }
  88. void main()
  89. {
  90. Foo f = new Foo;
  91. f.foo;
  92. f.bar(3);
  93. }

输出:
  1. SuperBar.this()
  2. SuperBar.this()
  3. Policy.this()
  4. SuperBar.this()
  5. Policy2.this()
  6. Foo.this()
  7. Foo.foo
  8. bar()
  9. Foo.~this()
  10. Policy2.~this()
  11. Policy.~this()


Have fun!
分享到:
评论
1 楼 ansili 2007-11-22  
   .支持

相关推荐

Global site tag (gtag.js) - Google Analytics