我想做这样的事情:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
Run Code Online (Sandbox Code Playgroud)
所以,我想查看我的应用程序的Universe中的所有类,当我找到一个来自Animal的类时,我想创建一个该类型的新对象并将其添加到列表中.这允许我添加功能而无需更新事物列表.我可以避免以下情况:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Run Code Online (Sandbox Code Playgroud)
通过上面的方法,我可以简单地创建一个扩展Animal的新类,它将自动被拾取.
更新:2008年10月16日上午9:00太平洋标准时间:
这个问题引起了很多很好的回应 - 谢谢.从回答和我的研究中,我发现我真正想要做的就是在Java下不可能.有一些方法,比如ddimitrov的ServiceLoader机制可以工作 - 但它们对我想要的东西非常重,我相信我只是将问题从Java代码转移到外部配置文件.
另一种表达我想要的方式:我的Animal类中的静态函数查找并实例化从Animal继承的所有类 - 无需任何进一步的配置/编码.如果我必须配置,我也可以在Animal类中实例化它们.我理解,因为Java程序只是一个松散的.class文件联合体,就像它一样.
有趣的是,在C#中,这似乎相当微不足道.
谷歌对这些类型的搜索毫无用处,因为你得到了数亿个结果,绝对没有一个与特定问题有关.
问题很简单:
这是我试过的......
type
TMyObject = class
// ...
end;
TMyObjectClass = class of TMyObject
TMyObjectA = class(TMyObject)
// specifics here
end;
TMyObjectB =class(TMyObject)
// specifics here
end;
TMyComponent = class(TComponent)
private
FObjectType: TMyObjectClass;
published
property ObjectType: TMyObjectClass read FObjectType write FObjectType;
end;
Run Code Online (Sandbox Code Playgroud)
上面的代码编译得很好,但是Object Inspector根本没有显示ObjectType属性.
我的目标(如果您还没有猜到)是为了让我可以从特定基类中选择一个类后代,以使相同的组件以不同的方式运行.
我想这样做,以便组件不需要直接了解子类(它需要完全模块化).
让我说清楚一点:我不能使用Enum在子类类型之间进行选择,因为组件不能直接链接到子类类型(在这种特殊情况下根本不可能)
无论如何......提前谢谢!
不允许使用此代码:
class constructor TOmniMultiPipelineStage.Create;
var
RTTIType: TRttiType;
begin
RTTIType:= TRttiContext.GetType(self);
end;
Run Code Online (Sandbox Code Playgroud)
[dcc32错误] OtlParallel.pas(5040):E2003未声明的标识符:'self'
该变体也是不允许的:
class constructor TOmniMultiPipelineStage.Create;
var
RTTIType: TRttiType;
begin
//Not really what I want because I want the actual type of the class
//Not a fixed ancestor type
RTTIType:= TRttiContext.GetType(TOmniMultiPipelineStage);
end;
Run Code Online (Sandbox Code Playgroud)
[dcc32 Error] OtlParallel.pas(5039):E2076这种形式的方法调用仅允许类方法或构造函数
如何在类构造函数中获取类的RTTI信息?
自我注意:循环遍历类的所有后代:Delphi:在运行时查找从给定基类下降的类?
我正在寻找一种方法来获取从Python中的特定基类派生的所有类的列表.
更具体地说,我使用的是Django,我有一个抽象的基础模型,然后是几个派生自该基类的模型......
class Asset(models.Model):
name = models.CharField(max_length=500)
last_update = models.DateTimeField(default=datetime.datetime.now())
category = models.CharField(max_length=200, default='None')
class Meta:
abstract = True
class AssetTypeA(Asset):
junk = models.CharField(max_length=200)
hasJunk = models.BooleanField()
def __unicode__(self):
return self.junk
class AssetTypeB(Asset):
stuff= models.CharField(max_length=200)
def __unicode__(self):
return self.stuff
Run Code Online (Sandbox Code Playgroud)
我希望能够检测是否有人添加了新的AssetTypeX模型并生成了适当的页面,但是目前我手动维护一个列表,有没有办法确定任何派生自"资产"的类名列表?
delphi ×2
reflection ×2
django ×1
fpc ×1
inheritance ×1
java ×1
oop ×1
properties ×1
python ×1
reference ×1
rtti ×1