`
oldrev
  • 浏览: 234406 次
  • 性别: 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  
   .支持

相关推荐

    JavaScript mixin实现多继承的方法详解

    总结来说,JavaScript中的mixin方法是一种非常实用的技术,它能帮助我们在不改变对象原型链的情况下,实现对方法的继承,从而模拟多继承的效果。在实际开发中,合理地使用mixin技术,可以大大增强代码的复用性,提升...

    es5生成class支持构造传参继承函数复用多继承

    本文将详细介绍如何在ES5中模拟类(class)的构造传参、继承、函数复用以及多继承。 首先,让我们来看看如何在ES5中创建一个具有构造函数和参数的“类”。构造函数是一个特殊的方法,用于初始化新创建的对象。在ES5...

    JS自定义混合Mixin函数示例

    在现代Web开发中,JavaScript是一种被广泛使用的脚本语言。...通过本篇文档,我们可以看到,即使在不支持传统继承的JavaScript中,我们依然可以通过这种方式来模拟继承机制,这对于构建复杂的应用程序是非常有用的。

    用JavaScript实现单继承和多继承的简单方法

    JavaScript不直接支持多继承,但可以通过混合(Mixin)或者使用原型链的组合来模拟多继承效果。一种常见的实现方式是使用`copyClassPrototypeProperties`辅助函数,将多个类的属性和方法复制到一个类的原型上: ```...

    Python中泛型函数应用案例.pdf

    然而,作者表达了对Mixin模式的不满,认为它会增加客户端类的负担,导致学习曲线变得更陡峭,因为如果存在多个需要相同接口的类,你必须为每个类重复添加Mixin。此外,Mixin方法会在类命名空间中引入更多的方法和...

    JavaScript设计模式中文版第4章-继承.pdf

    基于类的继承通常通过函数构造器模拟类的概念,而基于原型的继承则利用原型对象来实现。在本章中,我们将重点讨论这两种方式。 首先,我们来看一下基于类的继承。在JavaScript中,函数可以作为构造器创建对象,函数...

    join-lines.chocmixin:一个模拟 vim 的 J 的 mixin

    1. **Mixin概念**:在JavaScript中,mixin是一种将多个对象的功能组合在一起的方式。它可以是一个函数或一个对象,其目的是为了复用代码并提供模块化的设计。`join-lines.chocmixin`就是这样一个实现了特定功能...

    微信小程序开发教程之增加mixin扩展

    在微信小程序开发中,mixin(混合)是一个非常实用的概念,尤其对于代码复用和解决多继承问题。尽管原生的小程序框架并未直接提供mixin的支持,但通过一些技巧,我们可以模拟实现类似的功能。本教程将详细介绍如何为...

    浅析Python中的多重继承

    多重继承是Python语言的一个特性,它允许一个子类可以继承多个父类的功能。多重继承在面向对象编程中,提供了一种在类之间共享和复用代码的机制。通过这种方式,子类不仅可以从一个父类继承属性和方法,还可以从多个...

    Web-前端html+css从入门到精通 225. Sass与Less混入命名空间继承.zip

    命名空间在Sass和Less中不是直接的概念,但在组织代码时,我们可以使用嵌套选择器模拟类似的功能。通过将相关的样式规则放在一起,可以避免全局污染,提高代码的可读性。例如,我们为某个模块或组件创建一个命名...

    multiple.js:Javascript原型继承的多重继承

    但是,如果我们想要`Child`继承多个父类,可以使用`Object.create()`方法或使用闭包和寄生构造函数来模拟多重继承。 1. 使用`Object.create()`: ```javascript function Parent1() {} Parent1.prototype.parent1...

    js代码-类混入 把不同类的行为混入到一个类是一种常见的JavaScript模式。虽然ES6没有显示的支持多类继承,但是通过特性可以轻松地模拟这种行为。

    虽然ES6引入了类的概念,但它并不直接支持多继承,但我们可以利用JavaScript的灵活性来实现类混入。 ### 类混入的基本概念 类混入允许我们将一个类(或多个类)的方法和属性注入到另一个类中,使得目标类具备了...

    前端开源库-eredita

    除了基本的继承功能,eredita可能还提供了其他高级特性,如静态方法的继承、混合继承(mixin)、接口实现等。这些特性可以帮助开发者更好地遵循面向对象的设计原则,编写出结构清晰、可读性强的代码。 在实际项目中...

    第17章 扩展 symfony1

    这种模拟多重继承的方式在处理多层抽象时非常有用,例如,当你需要一个类同时具有多个类的功能时。在我们的例子中,`Novel` 类既具备了故事的特性(如标题、主题和角色),又具备了书籍的特性(如 ISBN 编号)。通过...

    更好的类类继承支持JavaScript库

    这些库还可能支持静态属性的继承,以及更高级的特性,如多重继承或混合(mixin)。 总结起来,JavaScript的内置继承机制虽然强大,但在某些方面存在不足。开发者可以通过使用特定的库,如在`Better-class-like-...

    Base.js 库 实现 JS 的对象化编程

    虽然JavaScript没有内置的私有方法和属性,但可以通过命名约定(如在方法名前加下划线`_`)来表示私有方法,或者使用闭包来模拟私有变量。 总结,Base.js 库通过提供一套完善的面向对象编程工具,使得在JavaScript...

    08Ruby 模块.docx

    Mixin 是 Ruby 中的一种特殊机制,用于模拟多重继承的效果。通过将模块混入到类中,可以让类获得模块中的方法和属性。 **示例代码**: ```ruby module Movable def move(x, y) # 实现移动逻辑 end end class ...

Global site tag (gtag.js) - Google Analytics