2017-06-29 10 views
2

オブジェクトが特定のクラスの子孫であるかどうかを確認したいと考えていますが、それは可能ではありません。オブジェクトがhaxeの与えられたクラスの子孫であるかどうかチェックする方法は?

など。 haXeの中に同じ機能を実現するための最良の方法だろう何

using std::dynamic_pointer_cast; 
auto SystemContainer::add(std::shared_ptr<ISystem> system) -> SystemContainer* 
{ 
    { 
     if (auto systemInitialize = dynamic_pointer_cast<IInitializeSystem>(system)) { 
      initializeSystems_.emplace_back(systemInitialize); 
     } 
     if (auto cleanupSystem = dynamic_pointer_cast<ICleanupSystem>(system)) { 
      cleanupSystems_.emplace_back(cleanupSystem); 
     } 
     if (auto teardownSystem = dynamic_pointer_cast<ITearDownSystem>(system)) { 
      teardownSystems_.emplace_back(teardownSystem); 
     } 
    } 

    if (auto systemExecute = dynamic_pointer_cast<IExecuteSystem>(system)) { 
     executeSystems_.emplace_back(systemExecute); 
    } 

    return this; 
} 

:?私もC++は、このことができますC#

public virtual Systems Add(ISystem system) { 
     var initializeSystem = system as IInitializeSystem; 
     if(initializeSystem != null) { 
      _initializeSystems.Add(initializeSystem); 
     } 

     var executeSystem = system as IExecuteSystem; 
     if(executeSystem != null) { 
      _executeSystems.Add(executeSystem); 
     } 

     var cleanupSystem = system as ICleanupSystem; 
     if(cleanupSystem != null) { 
      _cleanupSystems.Add(cleanupSystem); 
     } 

     var tearDownSystem = system as ITearDownSystem; 
     if(tearDownSystem != null) { 
      _tearDownSystems.Add(tearDownSystem); 
     } 

     return this; 
    } 

からポート次のコードをしたいと思いますか オブジェクトは、私がテストしているいくつかのクラスの子孫かもしれないことに注意してください。

答えて

3

Std.is()を試しましたか?

if (Std.is(system, IInitializeSystem)) { 
    _initializeSystems.add(cast system); 
} 

if (Std.is(system, IExecuteSystem)) { 
    _executeSystems.add(cast system); 
} 

// etc 
+0

すごいです!それがまさに私が必要なものです。好奇心が強い:コンパイル時にマクロを使用して同じ結果を得ることは可能でしょうか?オブジェクトの型はコンパイル時に知られているためです。私がテストしているクラスの数は一定です。 – montonero

+0

ここでマクロを使用して正確に何を達成したいのか分かりません。 'add()'メソッドと '_initializeSystems' /' _executeSystems'リストを生成しますか? – Gama11

+0

この機能の背後にあるロジック(Systems.add(system:ISystem))は次のとおりです。 'system'が可能なISystemXyzクラス(限定数)の子孫であるかどうかによって、対応するコンテナに追加します。 'system'が複数のISystemXyzのサブクラスである場合、複数のコンテナに追加されます。 私は 'systems.add(mySystem)'を呼び出すと、コンパイル時にmySystemの型を知っているので、コンパイル時に 'mySystem'がどこに追加されているのか判断できるようにしたいので、この関数をインライン化します。 'Std.is'(私が正しく理解していれば)は実行中にそれを行います。 – montonero

関連する問題