[和管子对话] 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经典面试题,
王论:
我认为抽象类一般都是在类结构的上层
王论:
我试过了,继承下来没有问题,就是实体类-抽象类-实体类的办法没有问题,基本和一般的继承区别不大,但是中间那一层作为抽象类,实在没有什么意义,还强迫最下层的类实现其抽象方法,不过,我还真没发现这种继承的意义何在,完全颠覆了抽象类作为公共定义的意义。
另外实体类,可以没有明确定义构造函数,抽象类继承也没有问题。
以下是一个示例:
2
3namespace Anytao.Mynet
4{
5 public class Dog2
6 {
7 public virtual void Yelp()
8 {
9 Console.Write("Dog yelp.");
10 }
11 }
12
13 public abstract class AnimalLive: Dog2
14 {
15 protected string _name;
16 public string Name
17 {
18 get { return _name; }
19 set { _name = value; }
20 }
21 public abstract int GetName
22 {
23 get;
24 }
25
26 public abstract void Run();
27
28 public override void Yelp()
29 {
30 Console.WriteLine("Animal Yelp");
31 }
32 }
33
34 public class Duck2 : AnimalLive
35 {
36 public override void Run()
37 {
38 throw new Exception("The method or operation is not implemented.");
39 }
40
41 public override int GetName
42 {
43 get { throw new Exception("The method or operation is not implemented."); }
44 }
45 }
46
47 public class Test
48 {
49 static void Main(string[] args)
50 {
51 Dog2 dog = new Dog2();
52 dog.Yelp();
53
54 Duck2 duck = new Duck2();
55 duck.Yelp();
56
57 AnimalLive animal = new Duck2();
58 animal.Yelp();
59 }
60 }
61
62}
63
管语:
我们讨论反射吧,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只是个例子,反射在设计模式中经常可以发挥巨大的作用,例如工厂类中,一个小例子看看:
2 {
3 public static void Main(string[] args)
4 {
5 IRun animalRun = RunFactory.GetRun();
6 animalRun.Run();
7 }
8 }
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 }
运行结果为:
问题抛出:
1 抽象类,可以从实体类继承,这样实现的意义何在,在什么场合有用?请大家畅所欲言。
2 反射的典型应用还有哪些?
©2007 Anytao.com 转贴请注明出处,留此信息。
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。
This posting is provided "AS IS" with no warranties, and confers no rights.
Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
https://worktile.com