2012-02-27 64 views
3

我有一个实现类似这样的接口的类;基于接口字符串名称的实例化类

... = new Location<ICafe>(); 
... = new Location<IBusiness>(); 
etc 

如果我想扩大Location类型的数量,我需要编辑此刻的代码。

有没有一种方法可以基于接口的字符串名称实例化类?

所以我会从数据库中获得Cafe或Business,并且想使用界面的字符串名称来实例化上述内容。

编辑

我要指出,我用iCafe咖啡厅,汇网等,以后的代码,以确定哪些类型的项目,这是什么在屏幕上显示。

回答

4

是,反射可以让你做到这一点,但会有几个步骤:

+0

这很好,但你有硬编码ICafe,我想要接口作为字符串。 – griegs 2012-02-27 02:23:51

+0

这只是一个占位符,以获得通用。 – 2012-02-27 02:29:28

+0

啊,是的,对不起。得到它的工作谢谢你。 – griegs 2012-02-27 02:36:39

2

在我看来,你可能会被更抽象的受益。是有一些原因,你不能都叫做超接口:

interface IAbstractLocation 

然后,创建使用适当的接口你的具体类,但与这些接口从AbstractLocation类型继承:

interface ICafe : IAbstractLocation 

interface IBusiness : IAbstractLocation 

然后你将有1种类型:

...Location<IAbstractLocation>(); 

的应处置的任何新类型,您可以添加从IAbstractLocation接口继承。

+0

但是那么我怎么告诉其他地方,这是一个ICafe或IBusiness等? – griegs 2012-02-27 02:25:52

+2

@griegs:这首先破坏了使用多态的目的。我喜欢认为我不是一个“宗教”程序员,但是如果你必须知道你的泛型参数是哪种类型,或者哪种类型实际上实现了给定的接口,那么我敢说你可能做错了。 – 2012-02-27 02:30:00

+0

我不是100%确定,但会在对象上调用getClass()告诉你类名?另外,我同意Ed S.,你可能会想到这是错误的方式;)另外,Java是一种类型化的语言,它会限制你可以做些什么...... – jmort253 2012-02-27 02:30:27