請考慮以下情況:Java可以在Objective C中做類似的事情嗎?
Object > MyClass > MyClassA, MyClassB
如果我要在對象層次的東西,比如我加printDetail();我如何在Java實現中實現它?此外,我可以重寫所有對象的方法。例如,我需要一個全新的.toString(),我可以覆蓋它嗎?謝謝。
請考慮以下情況:Java可以在Objective C中做類似的事情嗎?
Object > MyClass > MyClassA, MyClassB
如果我要在對象層次的東西,比如我加printDetail();我如何在Java實現中實現它?此外,我可以重寫所有對象的方法。例如,我需要一個全新的.toString(),我可以覆蓋它嗎?謝謝。
所有Java類最終都有java.lang.Object
正因爲如此,所有Java classes inherit
方法從Object
。這些方法中有一半是final
,不能是overridden
。但是,Object中的其他方法可以被重寫
Object類中的toString()方法用於顯示有關任何對象的某些信息。
所以,你可以根據你自己重寫吧...
EX ..
public class Test{
@Override
public String toString() {
/// staff
}
}
我明白了。我使用紅寶石,允許我重寫頂級對象。 – DNB5brims 2012-03-14 07:22:04
正如在其他的答案中提到,沒有什麼真像一個類別。移植到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類別中的名稱衝突被認爲是不好的。
很好的答案..! – 2013-07-31 18:02:05
雖然評論有些學術性,但我認爲問題在於因素:例如,如果我想要一種方法來隨機化數組中的事物順序,我可能會說:「從語義上講,這是我要求數組執行的一種行爲;因此,我會將其作爲數組中的一種方法進行語法添加」。我認爲這不會削弱強類型或面向對象。但是,不,這不是Javaish。 – Tommy 2015-05-14 19:57:55
C#不是強類型的OO語言嗎?因爲C#通過擴展方法提供了這種能力。從其他語言獲得好東西有什麼不好?這是一種進步...... – obe 2015-12-17 21:58:22