首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java可以在Objective C中做一些类似于类别的事情吗?

Java可以在Objective C中做一些类似于类别的事情吗?
EN

Stack Overflow用户
提问于 2012-03-14 12:21:50
回答 2查看 7.7K关注 0票数 18

考虑以下情况:

代码语言:javascript
复制
Object > MyClass > MyClassA, MyClassB

如果我想要对象级别的东西,例如,我添加了printDetail();我如何在Java实现中实现它?此外,我是否可以重写对象的所有方法。例如,我需要一个全新的.toString(),我可以覆盖它吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-14 12:29:41

不,它不能,至少不能。Objective C是一种动态类型和作用域的语言,这使得它非常容易受到类别等特性的影响。在Java语言中,最接近这一点的是通过字节码操作库(如ASMJavassist )进行的类插装。

但实际上,当使用像Java这样的强类型OO语言时,您应该接受它的特性,而不是试图复制另一种语言的特性。

票数 28
EN

Stack Overflow用户

发布于 2014-01-24 03:56:15

正如在其他答案中提到的,没有什么是真正像类别的。在移植到java时,我确实为objective-c代码中的一些类别提供了一些常用的解决方案。我的许多objective-c类别之所以存在,是因为我不想扩展iOS基类,但我确实想为该类添加一些功能。许多objective-c类别不使用objc_SetAssociatedObject添加属性。对于这些情况,我使用Java中的静态助手类。让我们看一个使用NSString和String的示例。我将向两者添加功能,以便将引号添加到字符串中。我们将假设这是有用的,并且为了说明的目的并不存在。在objective-c中,我们可能有:

代码语言:javascript
复制
@interface NSString (MyCategory)

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

@end

@implementation NSString (MyCategory)

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

@end

你可以从下面这样的地方调用它:

代码语言:javascript
复制
NSString *myString = @"When you're curious, you find lots of interesting things to do.";
NSString *quotedString = [myString quotedString];

下面是我如何在Java中实现这一点:

代码语言:javascript
复制
public class StringHelper {

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

并将其称为:

代码语言:javascript
复制
String myString = = "When you're curious, you find lots of interesting things to do.";
String quotedString = StringHelper.quotedString(myString);

如果您认为类别方法是自动将self变量作为第一个方法参数发送的方法(尽管是不可见的),那么这就更有意义了。

对于您的示例,如果我不扩展特定的对象,我可能会这样做:

代码语言:javascript
复制
public class ObjectHelper {

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

更新:一位评论者要求限制。

限制是代码在单独的静态类中。它不像一个类别那么方便。您必须记住这些类名,或者找到它们,并且不会在helper中的原始对象方法上获得自动完成。此外,您不能像使用objc_SetAssociatedObject那样使用对象级别的特性或属性。您可以使用散列映射并创建类似于原始对象实例的内容作为散列键。

代码语言:javascript
复制
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类别中的名称冲突被认为是不好的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9695887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档