2011-12-30 87 views
4

我想將一些代碼從Java轉換爲Objective-C,並且我很難轉換Java通用部分。例如,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類型的對戰式擦除。這就是其中的一種情況,你應該非常小心地避免翻譯成「一字一句」的成語,因爲這些地區圍繞廢話的可能性非常高。最好的方法是嘗試將現有設計用作新項目的靈感而不是模板。當我將Java翻譯成C#時,它非常適合我 - 儘管它更接近適合,但仍足以證明重大重構的合理性。 – dasblinkenlight 2011-12-30 22:45:44

回答

2

Java泛型創建爲編譯時類型安全添加到集合和參數化類。在像Java這樣的靜態類型語言中,這可能非常有用,但在動態類型化並具有動態分派的Objective C中更不那麼重要。

我建議你在從Java轉換時簡單地刪除通用佔位符,並用代替通用返回類型/參數,編號爲

2

例如,在Java類聲明,我相信是說,當前類擴展任何類是子類組件類別

不,ComponentMapper<T extends Component>意思是可以使用任何延伸Component(或Component本身)的類對ComponentMapper類進行參數化。因此,你可以做new ComponentMapper<MySpecialComponent>

在運行時的通用信息將被刪除導致ComponentMapper<Component>是),即編譯器會看到public T get(Entity e)public MySpecialComponent get(Entity e),而在運行時類型擦除後,它只是public Component get(Entity e)

除此之外ComponentWrapperComponent具有具有-一個關係,即具有ComponentWrapperComponent.class類型的成員(或Class<Component>,這意味着相同的:不是Component實例,但類本身的引用)。擴展將是一個is-a關係。

+0

好吧,這意味着ComponentMapper包含組件的子類或子類的列表?所以在Obj-c中,我不應該擴展組件,而應該參考它? – Black20 2011-12-31 05:55:57

+0

@ user1106500我實際上並不知道,因爲缺少一些代碼('World'沒有被使用,'em'沒有聲明等)。看起來包裝實際上只是從某個地方獲取組件(是'''EntityManager'?)並投射它。取決於'em.getComponent(e,type)'實際上你可能需要另一種解決方案,或根本不需要'ComponentWrapper'。讓我指出一件重要的事情:在嘗試將代碼移植到另一種語言之前,您應該知道它實際做了什麼,而不僅僅是猜測。所以首先了解Java代碼的邏輯,然後將其移植到Objective-C。 – Thomas 2011-12-31 08:10:19