할 수 있는 자바와 같이 카테고리에서 목표 C?
-
13-12-2019 - |
문제
고려 다음과 같은 상황:
Object > MyClass > MyClassA, MyClassB
면 내가 뭔가를 원하는 개체 수준에,예를 들면,나는 추가 printDetail();어떻게 할 수 있습니다 Java 구현?또한,재정의할 수 있습니라 모든 개체의 방법입니다.예를 들어,내가 가질 필요가 전혀 새로운.toString(),재정의할 수 있습니다?감사합니다.
다른 팁
다른 답변에서 언급했듯이 카테고리가 정말로 싫어하는 것은 없습니다. 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
}
}