考虑以下情况:

Object > MyClass > MyClassA, MyClassB

例如,如果我想要对象级别的某些内容,我添加了 printDetail();我怎样才能在Java实现中做到这一点?此外,我可以重写所有对象的方法吗?例如,我需要一个全新的 .toString(),我可以覆盖它吗?谢谢。

有帮助吗?

解决方案

否它不能,不是真的。目标C是一种动态类型和范围的语言,它使其非常适合类别。最接近的Java中可以通过像

但是,当使用像Java这样的强类型的OO语言时,您应该拥抱其特征,而不是尝试复制另一种语言。

其他提示

在其他答案中提到的,没有什么是类似的类别。在移植到Java时,我确实在我的Objective-C代码中使用了一些常见的解决方案。许多我的Objective-c类别存在,因为我不想扩展iOS基类,但我要为该类添加一些功能。其中许多目标-C类别不使用objc_setassociationobject添加属性。对于那些情况,我在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;
    }
}
.

更新:评论者要求限制。

限制是代码在单独的静态类中。它不如一个类别那么方便。您必须记住这些类名,或找到它们,您不会在帮助程序中的原始对象方法上自动完成。此外,您不能使用对象级属性或属性,如objc_setassociationobject。您可以使用哈希映射并创建与原始对象实例类似的东西作为哈希键。

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);
        }
    }
}
.

也没有名称与原始类发生冲突,这将是一个更好的益处。 Objective-C类别中的名称被认为是坏的。

所有 Java 类最终都有 java.lang.Object 正因为如此,所有 Java classes inherit 方法来自 Object. 。这些方法有一半是 final 并且不能是 overridden. 。然而, Object 中的其他方法可以并且被重写
Object 类中的 toString() 方法用于显示有关任何对象的一些信息。
所以你可以根据自己的情况覆盖它......
前任..

public class Test{  
  @Override
  public String toString() {  
  /// staff  
  }  
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top