`
ideage
  • 浏览: 321092 次
社区版块
存档分类
最新评论

D语言动态创建对象-D最新功能

阅读更多
我认为这是D提供的又一个重量级的功能.闲言少叙,代码说话!

保存为cre.d,使用dmd cre.d编译.

module cre;

import std.stdio;

interface IPrinter
{  
  void print();
  void init(char[] a);
}

class foo :IPrinter
{  
  void print()
  {
    writefln("foo OK  "~fb);    
  }
  
  void init(char[] a)
  {
    fb = " Hollo "~a;
  }
  
  char[] fb;
}


class fbb :IPrinter
{  
  void print()
  {
    writefln("fbb:OK! "~fb);    
  }
  
  void init(char[] a)
  {
    fb = "Thank you "~a;
  }
  
  char[] fb;
}

//IOC Factory.
class Factory(T)
{  
  static T create(char[] Name)
  {
    T instance =cast(T)Object.factory(Name);
    assert(instance); 
    return instance;    
  }   
}


int main()
{
  writefln("Factory Test!");
  alias Factory!(IPrinter) PT;
  IPrinter a = PT.create("cre.foo");
  a.init("Walter!"); 
  a.print();
  
  IPrinter b = PT.create("cre.fbb");
  b.init("Walter!"); 
  b.print(); 
  return 1;
}


根据这个功能,结合动态链接库,可以提供简单插件的功能了!!!
实现了IOC,针对抽象进行依赖.

昨天看到,晚上想到了,早晨实现了,现在贴上, 真不错.
分享到:
评论
11 楼 achun 2007-03-30  
有比没有强,用不用看您的选择了,
只要不影响整体就行
10 楼 ideage 2007-03-28  
应该不会太慢.都是查找,然后创建.如果有多个DLL,我想可能会慢点.
9 楼 qiezi 2007-03-28  
new后面都比较高效了,查找到了就直接调用ClassInfo.create,里面调用_d_newclass,和直接new效率差不多。查找的过程这么慢,哪天发展出java这么庞大的库,调用这个多慢,不过以后肯定会优化的,说说而已。
8 楼 ideage 2007-03-28  
qiezi 写道
里面调用了ClassInfo.find(classname),这个实现效率真低:
[玩具


关键要看new操作符是怎么产生对象的.才能够决定吧!
7 楼 qiezi 2007-03-27  
里面调用了ClassInfo.find(classname),这个实现效率真低:
    /*************
     * Search all modules for ClassInfo corresponding to classname.
     * Returns: null if not found
     */
    static ClassInfo find(char[] classname)
    {
	foreach (m; ModuleInfo.modules())
	{
	    //writefln("module %s, %d", m.name, m.localClasses.length);
	    foreach (c; m.localClasses)
	    {
		//writefln("\tclass %s", c.name);
		if (c.name == classname)
		    return c;
	    }
	}
	return null;
    }

玩具
6 楼 oldrev 2007-03-27  
没什么用,既造成一堆 static 的东西,功能又太有限
5 楼 h_rain 2007-03-27  
晕~,这是鸡肋吗?
4 楼 qiezi 2007-03-27  
必须在一个module里面亚,否则就AV了。
3 楼 h_rain 2007-03-27  
哦!
结合上脚本,就极其简单的实现了外置的对象管理功能啊.
2 楼 oldrev 2007-03-27  
Walter 同志,赶快住手吧!RTTI的代价可是不小的,再搞就成 java 了。
0.001的升级就能造成兼容问题,这算怎么回事?还是修正 bug,完善标准库要紧。
1 楼 soulmachine 2007-03-27  
不错!

相关推荐

    HP-Socket v3.1.1 正式版

    (2) 调用 ::Create_HP_Xxx(pListener) 函数创建 HPSocket 对象 (3) 调用 ::HP_Set_FN_Xxx_OnYyy(pListener, ...) 函数设置监听器的回调函数 (4) 调用相关导出函数操作 HPSocket 对象 (5) ...... ...... (6) 调用 ::...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session...

    数据结构(C++)有关练习题

    b. 创建一个班机链表,每个节点都包含指向一个乘客链表的指针; c. 该程序要有顾客购票,查询班机起飞降落时间,班机订票情况等3个功能,并实现菜单选项 5、 用C++编写一个简单的行编辑器,每个结点保存一...

    互联网创意产品众筹平台

    │ 3-用户管理模块-分配角色-功能实现 │ 4-RBAC权限模块- │ 5-数据库表之间关系 │ 6-类与类之间关系 │ 7-分析许可维护树型结构, G5 A7 ^2 |/ q; P" U │ 8-创建许可模块的组件-bean,controller,service,mapper6 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.4 创建对象-关系映射文件  3.4.1 映射文件的文档类型定义(DTD)  3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session...

    超级有影响力霸气的Java面试题大全文档

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    JavaScript笔记

    D []--实例化一个空数组对象 实例化空数组:var arr=[]; 特点:元素个数不限定,元素类型不限制 13.Array 对象的常用方法: |--1.join()方法--用于把数组中的所有元素放入一个字符串 | eparato表示要使用的...

    C++MFC教程

    更令人兴奋的是利用C++的封装功能使开发者摆脱Windows中各种句柄的困扰,只需要面对C++中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助) 正因为MFC是建立在C++的...

    语言程序设计课后习题答案

    面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得...

    对python创建及引用动态变量名的示例讲解

    实际上在python中用列表就可以实现动态变量名的管理,python中的列表中可以存储任何类型的元素: listA = [0,"str",B()] ...以上这篇对python创建及引用动态变量名的示例讲解就是小编分享给大家的全部内容了,

    程序员为什么还要刷题-caracal:Caracal是一个ruby​​库,用于动态创建专业品质的MicrosoftWord文档(.docx)

    样式的语法动态创建专业质量的 Microsoft Word 文档。 Caracal 不是一个神奇的 HTML 到 Word 翻译器。 相反,它是一种用于生成 Office Open XML (OOXML) 的标记语言。 程序员通过针对文档对象发出一系列简单命令来...

    C++Builder_5开发人员指南03

    第三部分“编写分布式应用程序”描述如何创建We b服务器应用程序,如C G I应用程序或动态链接 (D L L)。C + + B u i l d e r提供特殊的I n t e r n e t组件,能够更易于处理与特殊的统一资源标识符( U R I...

    会计理论考试题

    A、自然语言 B、机器语言 C、汇编语言 D、高级语言 12.汇编语言是一种 ___C__ 。 A、机器语言 B、高级语言 C、低级语言 D、目标程序 13.PowerPoint是著名的___A___,可用以制作计算机化的演示材料。 A、简报软件 B...

    C++Builder_5开发人员指南

    第三部分“编写分布式应用程序”描述如何创建We b服务器应用程序,如C G I应用程序或动态链接 (D L L)。C + + B u i l d e r提供特殊的I n t e r n e t组件,能够更易于处理与特殊的统一资源标识符( U R I...

    C++复习资料之系列

    用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) 解释 (b) 汇编 (c) 编辑 (d) 编译 3.C++程序基本单位是( c )。 (a) 数据 (b) 字符 (c) 函数 (d) 语句 4. C++程序中的语句必须以( b )结束。 ...

    华为java笔试题面试题

    Java 语言是从 C++ 语言改进重新设计的, Java 语言的创始人 James Gosling 希望创建一种与 C++ 兼容的语言,但是更加安全、简单和面向对象。 2. 下列语句哪一个正确() 答案:B.Java 程序经编译后会产生 ...

Global site tag (gtag.js) - Google Analytics