2011-12-30 10 views
4

JavaからObjective-Cにコードを変換しようとしていますが、Java Genericの部分を変換するのが面倒です。たとえば、Javaのクラス宣言は、現在のクラスがComponentクラスのサブクラスである任意のクラスを拡張していると言っていますが、Objective-cではComponentクラスを拡張するだけですか?JavaをObjective-Cに変換する手助け

誰かが提供できる援助があれば幸いです。これで前進することで、同様のコードの他の部分を変換するのに役立ちます。おかげ

のJava:

public class ComponentMapper<T extends Component> { 

private Class<T> classType; 

public ComponentMapper(Class<T> type, World world) { 
    this.type = ComponentTypeManager.getTypeFor(type); 
    this.classType = type; 
} 

public T get(Entity e) { 
    return classType.cast(em.getComponent(e, type)); 
} 
} 

のObjective-C:例えば

@interface ComponentMapper : Component 
{ 
    ComponentType* componentType; 
    EntityManager* entityManager; 
    id classType; 
} 

- (id) init:(id) componentType World:(World*) world; 
- (id) get:(Entity*) entity; // can this just return Entity instead 

@end 

@implementation ComponentMapper 

- (ComponentMapper*) init:(id) type World:(World *) world { 
    if (self = [super init]) { 
     // should be a call to getEntityManager() 
     self->entityManager = [world entityManager]; 
     self->componentType = [ComponentTypeManager getTypeFor:type]; 
     self->classType = type; 
    } 

    return self; 
} 

- (id) get:(Entity*) entity 
{ 
    return [classType cast:[em getComponent:e param1:type]]; 
} 

@end 
+0

'Class 'はJavaのイディオムで、Javaジェネリックのタイプ消去と戦うように設計されています。これは、イディオムを「言葉のように」翻訳することを避けることを本当に慎重にすべきときの1つです。なぜなら、ナンセンスで終わる機会は、これらの領域では本当に高いからです。最善のアプローチは、既存のデザインをテンプレートではなくインスピレーションとして新しいプロジェクトに使用することです。それはJavaをC#に翻訳していたときに私にとってはうまくいっていましたが、それははっきりとはっきりしていましたが、それでも主要なリファクタリングを正当化するのに十分です。 – dasblinkenlight

答えて

2

Javaのジェネリックは、コレクションやパラメータ化クラスにコンパイル時の型の安全性を追加するために作成されました。 Javaのような静的型付けされた言語では、これは非常に便利ですが、動的に型指定され、動的ディスパッチを持つObjective Cではそれほど重要ではありません。

Javaから変換するときにジェネリックプレースホルダを削除し、汎用戻り型/引数をidに置き換えることをお勧めします。

2

は、私は信じていたJavaのクラス宣言は、現在のクラスがサブクラスである任意のクラスを拡張していることを言っていますコンポーネントクラスのクラス

Nope、ComponentMapper<T extends Component>クラスComponentMapperは、Component(またはComponent自身)を拡張する任意のクラスでパラメータ化できます。したがって、あなたは一般的な情報がComponentMapper<Component>結果として消去されている実行時など

new ComponentMapper<MySpecialComponent>を行うことができます)、実行時に型消去した後、それだけでpublic Component get(Entity e)であるのに対し、すなわち、コンパイラはpublic MySpecialComponent get(Entity e)としてpublic T get(Entity e)を見るでしょう。 ComponentWrapperComponentそのほかに

が有する-関係を有する、すなわちComponentWrapperは(:Componentないインスタンスが、クラス自体への参照同じ手段またはClass<Component>)タイプComponent.classの部材を有します。拡張はis-aの関係になります。

+0

これは、ComponentMapperにコンポーネントまたはコンポーネントのサブタイプのリストが含まれていることを意味しますか?したがって、Obj-cではコンポーネントを拡張するのではなく、そのコンポーネントへの参照を保持する必要があります。 – Black20

+0

@ user1106500コードがありません( 'World'は使用されず、' em'は宣言されていません)ので、実際にはわかりません。ラッパーが実際にどこかからコンポーネントを取得し( 'em'が' EntityManager'ですか?)、それをキャストするようです。 'em.getComponent(e、type)'が実際に行うことに応じて、別の解決策が必要な場合や、 'ComponentWrapper'がまったく必要ない場合があります。一つの重要なことを述べましょう:他の言語にコードを移植しようとする前に、それが実際に何をしているのかを知る必要があります。まず、Javaコードのロジックを理解し、Objective-Cに移植します。 – Thomas

関連する問題