문제

고려 다음과 같은 상황:

Object > MyClass > MyClassA, MyClassB

면 내가 뭔가를 원하는 개체 수준에,예를 들면,나는 추가 printDetail();어떻게 할 수 있습니다 Java 구현?또한,재정의할 수 있습니라 모든 개체의 방법입니다.예를 들어,내가 가질 필요가 전혀 새로운.toString(),재정의할 수 있습니다?감사합니다.

도움이 되었습니까?

해결책

아니, 정말로 어쨌든 그렇지 않습니다.객관적인 C는 동적으로 입력되고 범위가 지정된 언어이므로 카테고리와 같은 기능에 매우 편안하게 만듭니다.Java에서 가장 가까운 가장 가까운 것은 ASM 또는 javassist .

그러나 Java와 같은 강력한 형식의 OO 언어를 사용할 때는 다른 언어의 복제를 시도하는 것이 아니라 기능을 포용해야합니다.

다른 팁

다른 답변에서 언급했듯이 카테고리가 정말로 싫어하는 것은 없습니다. Java로 이식 할 때 내 Objective-C 코드의 범주 중 일부에서 사용하는 몇 가지 공통된 솔루션이 있습니다. iOS 기본 클래스를 확장하고 싶지 않지만 해당 클래스에 기능을 추가하고 싶지 않기 때문에 내 객관적인 C 카테고리가 존재합니다. 이러한 objective-c 카테고리 중 많은 부분은 objc_setassociatedObject를 사용하여 속성을 추가하지 않습니다. 이러한 경우 Java에서 정적 도우미 클래스를 사용합니다. nsstring 및 문자열을 사용하여 예제를 살펴 보겠습니다. 문자열에 따옴표를 추가하려면 두 가지 모두에 기능을 추가합니다. 우리는 이것이 유용하고 그림의 목적을 위해 존재하지 않는다고 가정합니다. 우리는 다음을 가질 수 있습니다 :

@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_SETASSOCINATEDOBJECT와 같은 개체 수준 속성이나 속성을 사용할 수 없습니다. 해시 맵을 사용하고 원래 객체 인스턴스와 해시 키로 비슷한 것을 만들 수 있습니다.

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.그러나, 다른 방법이 될 수 있습과 재정의
ToString()메소드에서 객체 클래스를 사용하여 몇 가지 정보를 표시에 관한 모든 개체입니다.
그래서 당신은 무시할 수 있습에 따라 그것을 자기...
EX..

public class Test{  
  @Override
  public String toString() {  
  /// staff  
  }  
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top