欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mixin 模拟多继承 博客分类: D语言 F# 

程序员文章站 2024-03-19 17:25:40
...
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!
相关标签: F#