2012-03-14 118 views
16

請考慮以下情況:Java可以在Objective C中做類似的事情嗎?

Object > MyClass > MyClassA, MyClassB 

如果我要在對象層次的東西,比如我加printDetail();我如何在Java實現中實現它?此外,我可以重寫所有對象的方法。例如,我需要一個全新的.toString(),我可以覆蓋它嗎?謝謝。

回答

28

不,它不能,不是真的。 Objective C是一種動態類型和範圍的語言,它非常適用於類別等功能。在Java中最接近這一點的是通過類似ASMJavassist這樣的字節代碼操作庫的類儀器。

但實際上,當使用像Java這樣的強類型OO語言時,應該擁抱它的特性,而不是試圖複製另一種語言的特性。

+0

很好的答案..! – 2013-07-31 18:02:05

+0

雖然評論有些學術性,但我認爲問題在於因素:例如,如果我想要一種方法來隨機化數組中的事物順序,我可能會說:「從語義上講,這是我要求數組執行的一種行爲;因此,我會將其作爲數組中的一種方法進行語法添加」。我認爲這不會削弱強類型或面向對象。但是,不,這不是Javaish。 – Tommy 2015-05-14 19:57:55

+1

C#不是強類型的OO語言嗎?因爲C#通過擴展方法提供了這種能力。從其他語言獲得好東西有什麼不好?這是一種進步...... – obe 2015-12-17 21:58:22

2

所有Java類最終都有java.lang.Object正因爲如此,所有Java classes inherit方法從Object。這些方法中有一半是final,不能是overridden。但是,Object中的其他方法可以被重寫
Object類中的toString()方法用於顯示有關任何對象的某些信息。
所以,你可以根據你自己重寫吧...
EX ..

public class Test{ 
    @Override 
    public String toString() { 
    /// staff 
    } 
} 
+0

我明白了。我使用紅寶石,允許我重寫頂級對象。 – DNB5brims 2012-03-14 07:22:04

11

正如在其他的答案中提到,沒有什麼真像一個類別。移植到java時,我在我的objective-c代碼中使用了一些常用的解決方案。我的很多objective-c類都存在,因爲我不想擴展iOS基類,但是我希望爲該類添加一些功能。許多這些objective-c類別不使用objc_SetAssociatedObject添加屬性。對於這些情況,我使用Java中的靜態助手類。我們來看一個使用NSString和String的例子。我將添加功能來爲字符串添加引號。我們假設這是有用的,並不存在用於說明的目的。在Objective-C,我們可能有:

@interface NSString (MyCategory) 

/** 
* Creates and autoreleased image from self. 
*/ 
- (NSString*)quotedString; 

@end 

@implementation NSString (MyCategory) 

- (NSString *)quotedString 
{ 
    return [NSString stringWithFormat:@"\"%@\"", self]; 
} 

@end 

你會從什麼地方稱之爲是這樣的:

NSString *myString = @"When you're curious, you find lots of interesting things to do."; 
NSString *quotedString = [myString quotedString]; 

下面我將如何在Java中實現這一點:

public class StringHelper { 

    public static String quotedString(String that) { 
     return '"' + that + '"'; 
    } 
} 

,並呼籲它:

String myString = = "When you're curious, you find lots of interesting things to do."; 
String quotedString = StringHelper.quotedString(myString); 

如果您將類別方法看作自動發送自變量作爲第一個方法參數的方法(雖然不可見),那麼這更有意義。

對於你的榜樣,如果我不會擴大特定對象,我可能會做這樣的事情:

public class ObjectHelper { 

    public static void printDetail(Object that) { 
     // do what it takes; 
    } 
} 

UPDATE:一個評論者要求的限制。

限制條件是該代碼位於單獨的靜態類中。這不像一個類別那麼方便。您必須記住這些類名,或者找到它們,並且您不會在助手中的原始對象方法上自動完成。此外,您不能使用像objc_SetAssociatedObject一樣的對象級屬性或屬性。您可以使用哈希映射並創建與原始對象實例類似的哈希鍵。

public class StringHelper { 
    private static Map<String, Integer> order = new HashMap(); 

    public static int getOrder(String that) { 
     if(that == null) { return 0; } 
     Integer ret = StringHelper.order.get(that); 
     if(ret == null) { return 0; } 
     else { return ret; } 
    } 
    public static void setOrder(String that, int order) { 
     if(that != null) { 
      StringHelper.order.put(that, order); 
     } 
    } 
} 

也沒有與原始類名稱衝突,這將是更多的好處。目標-c類別中的名稱衝突被認爲是不好的。

+0

我最喜歡這個答案,因爲它給了我一個解決方法。謝謝! – 2015-07-07 02:31:24

+0

@ptoinson如果我們將這種方式與iOS中的類別進行比較,什麼是限制? – NghiaDao 2016-12-05 08:07:05

+0

@NghiaDao - 添加到答案更新的限制。 – ptoinson 2016-12-06 19:21:30

相關問題