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

发布日期: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经典面试题,

王论:

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

王论:

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

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

以下是一个示例:  

 1using System;
 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只是个例子,反射在设计模式中经常可以发挥巨大的作用,例如工厂类中,一个小例子看看:

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     }



运行结果为:


问题抛出:

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

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

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

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

原文地址:https://www.cnblogs.com/anytao/p/709303.html