相关疑难解决方法(0)

在运行时,查找扩展基类的Java应用程序中的所有类

我想做这样的事情:

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#中,这似乎相当微不足道.

java reflection inheritance

139
推荐指数
5
解决办法
14万
查看次数

类引用作为属性

谷歌对这些类型的搜索毫无用处,因为你得到了数亿个结果,绝对没有一个与特定问题有关.

问题很简单:

  • 是否可以在Delphi中使用类引用属性?
  • 如果是这样,怎么样?

这是我试过的......

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在子类类型之间进行选择,因为组件不能直接链接到子类类型(在这种特殊情况下根本不可能)

无论如何......提前谢谢!

delphi oop properties reference fpc

7
推荐指数
1
解决办法
1093
查看次数

如何在类构造函数中访问RTTI?

不允许使用此代码:

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:在运行时查找从给定基类下降的类?

delphi reflection rtti

5
推荐指数
1
解决办法
915
查看次数

查找从python中的给定基类派生的所有类

我正在寻找一种方法来获取从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模型并生成了适当的页面,但是目前我手动维护一个列表,有没有办法确定任何派生自"资产"的类名列表?

python django

0
推荐指数
1
解决办法
349
查看次数

标签 统计

delphi ×2

reflection ×2

django ×1

fpc ×1

inheritance ×1

java ×1

oop ×1

properties ×1

python ×1

reference ×1

rtti ×1