[和管子对话] 3 2007-4-11/从堆栈到反射,想哪儿打哪儿

本文讨论了堆栈的概念及其在编程中的应用,并深入探讨了反射机制的作用及其实现方式,包括其在设计模式中的运用。

发布日期:2007.4.11 作者:Anytao

©2007 Anytao.com 转贴请注明出处,留此信息。

本文将介绍以下内容:

• 浅议堆栈

• 乱图反射

• 胡言乱语的技术

----------------------------------------------------------------------------------

管语:

平常说堆是堆,栈和堆栈这个名词是一样的

栈不需要程序员来操心,由编译器来负责,堆需要你维护,C++中的new和delete就是干这事的
在C#和java中,堆也不需要了,有垃圾自动收集

EJB的实体Bean分为BMP和CMP两种
我觉着这和堆、栈像,堆就是BMP,栈是CMP
BMP是用户管理bean生命周期
CMP是容器管理bean生命周期

王论:

哦,知道SharePoint吗?

管语:

哦!就是微软的Portal解决方案!

大公司都有Portal解决方案 IBM/BEA,好像oracle也有的

王论:

给我解释一下Portal吧,是门户解决方案的意思吧

网上公文流转,工作流什么的,都是流转的office文件,word最多,sharepoint是MS的,先天优势就不用说了,其实最主要还是office牛X呀!

管语:

我认为通俗地说,portal就是企业门户,这里边什么都有!有这个企业的日常办公、核心业务什么的,就是吃喝拉撒睡,这里一锅烩了!

什么是Portal?英文字面是“入口”,国内有叫“门户”技术的,但我觉得“集成”技术更能表达它的意思。Portal是一个基于web的应用程序,它主要提供个性化、单点登录、不同来源的内容整合以及存放信息系统的表示层。

今天题目我来定,先考你一下:P

接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类(concrete class)?

王论:

接口可以继承接口;抽象类可以实现接口;抽象类不能继承实体类;

最后一个没把握

管语:

最后一个的答案是:当实体类有明确的构造函数时,可以,没有时,不可以

王论:

问题是,抽象类继承实体类,用来做什么

呵呵,我写了一段代码,发现这样写根本没有意义,抽象类不能实体化,让他继承实体类,没有意义

管语:

不知道这问题有意义吗?这是网上说的java经典面试题,

王论:

我认为抽象类一般都是在类结构的上层

王论:

我试过了,继承下来没有问题,就是实体类-抽象类-实体类的办法没有问题,基本和一般的继承区别不大,但是中间那一层作为抽象类,实在没有什么意义,还强迫最下层的类实现其抽象方法,不过,我还真没发现这种继承的意义何在,完全颠覆了抽象类作为公共定义的意义。

另外实体类,可以没有明确定义构造函数,抽象类继承也没有问题。

以下是一个示例:  

 1 None.gif using  System;
 2 None.gif
 3 None.gif namespace  Anytao.Mynet
 4 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 5InBlock.gif    public class Dog2
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 7InBlock.gif        public virtual void Yelp()
 8ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 9InBlock.gif            Console.Write("Dog yelp.");
10ExpandedSubBlockEnd.gif        }
   
11ExpandedSubBlockEnd.gif    }

12InBlock.gif
13InBlock.gif    public abstract class AnimalLive: Dog2
14ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
15InBlock.gif        protected string _name;
16InBlock.gif        public string Name
17ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
18ExpandedSubBlockStart.gifContractedSubBlock.gif            get dot.gifreturn _name; }
19ExpandedSubBlockStart.gifContractedSubBlock.gif            set dot.gif{ _name = value; }
20ExpandedSubBlockEnd.gif        }

21InBlock.gif        public abstract int GetName
22ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
23InBlock.gif            get;
24ExpandedSubBlockEnd.gif        }

25InBlock.gif
26InBlock.gif        public abstract void Run();
27InBlock.gif
28InBlock.gif        public override void Yelp()
29ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
30InBlock.gif            Console.WriteLine("Animal Yelp");
31ExpandedSubBlockEnd.gif        }

32ExpandedSubBlockEnd.gif    }

33InBlock.gif
34InBlock.gif    public class Duck2 : AnimalLive
35ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
36InBlock.gif        public override void Run()
37ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
38InBlock.gif            throw new Exception("The method or operation is not implemented.");
39ExpandedSubBlockEnd.gif        }

40InBlock.gif
41InBlock.gif        public override int GetName
42ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
43ExpandedSubBlockStart.gifContractedSubBlock.gif            get dot.gifthrow new Exception("The method or operation is not implemented."); }
44ExpandedSubBlockEnd.gif        }

45ExpandedSubBlockEnd.gif    }

46InBlock.gif
47InBlock.gif    public class Test
48ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
49InBlock.gif        static void Main(string[] args)
50ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
51InBlock.gif            Dog2 dog = new Dog2();
52InBlock.gif            dog.Yelp();
53InBlock.gif
54InBlock.gif            Duck2 duck = new Duck2();
55InBlock.gif            duck.Yelp();
56InBlock.gif
57InBlock.gif            AnimalLive animal = new Duck2();
58InBlock.gif            animal.Yelp();
59ExpandedSubBlockEnd.gif        }
 
60ExpandedSubBlockEnd.gif    }

61InBlock.gif
62ExpandedBlockEnd.gif}

63 None.gif

 管语:

我们讨论反射吧,C#中有反射机制吗?

王论:

反射技术太牛了

反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件 通过对类型动态实例化后,还可以对其执行操作 一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情

我的理解是,你甚至可以利用发射调用任何Dll中的函数、属性、方法等

Assembly assembly = Assembly.LoadFile(“DGGL.dll”);

管语:

SUN看看关于java中的reflection(反射)机制的教学就全明白了。Java虽然不想Ruby,Python那样是动态语言,但它确提供了一种叫做Reflection的机制能够在程序运行时得到类和方法本身的一些meta data。这样做的一大好处在于减少大量的hard coding。Reflection机制甚至能帮助你动态加载某个类。写过JDBC的人都知道Class.forName(drivername),其中drivername是String类型,能够在运行时确定,因此加载数据库驱动类的行为也就在运行时发生了,而非编译时。

你的意思是利用反射,可以达到另外一种强的效果,比如调用本地的DLL,这个反射,似乎是动态编译

王论:

非也,调用本地Dll只是个例子,反射在设计模式中经常可以发挥巨大的作用,例如工厂类中,一个小例子看看:

1       class  Reflection2Factory
2      {
3           public   static   void  Main( string [] args)
4          {
5              IRun animalRun  =  RunFactory.GetRun();
6              animalRun.Run();            
7          }
8      }

 

 1       public   interface  IRun
 2      {
 3           void  Run();
 4      }
 5 
 6       public   class  DogRun : IRun
 7      {
 8           public   void  Run()
 9          {
10              Console.WriteLine( " Dog is running " );
11          }
12      }
13 
14       public   class  DuckRun : IRun
15      {
16           public   void  Run()
17          {
18              Console.WriteLine( " Duck is running " );
19          }
20      }

222.JPG

运行结果为:
333.JPG

问题抛出:

1 抽象类,可以从实体类继承,这样实现的意义何在,在什么场合有用?请大家畅所欲言。

2 反射的典型应用还有哪些?

 

©2007 Anytao.com 转贴请注明出处,留此信息。

本贴子以现状提供且没有任何担保,同时也没有授予任何权利。
This posting is provided "AS IS" with no warranties, and confers no rights.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值