2010-01-08 6 views
3

클래스가 MyClass입니다. 여기에 과장되어 있지만 MyClass에 1000 개의 인스턴스 변수가 있다고 가정 해 보겠습니다. 그런 다음 MyClass에있는 모든 인스턴스 변수에 하나 더한 MySubClass라는 하위 클래스를 만듭니다.목표 C - 하위 클래스 개체의 상속 된 변수 초기화

질문 : MyClass 클래스의 MyObj 객체가 있으면 MyDerivedObj의 인스턴스 변수가 MyObj의 인스턴스 변수와 동일하도록 MySubClass 클래스의 해당 객체 MyDerivedObj를 만드는 쉬운 방법이 있습니까? "동일"함으로써, MyObj의 인스턴스 변수가 객체에 대한 포인터 인 경우, MyDerivedObj의 해당 인스턴스 변수가 동일한 메모리를 가리켜 야한다는 점에서 나는 똑같은 것을 의미합니다.

+0

하지만 질문에 대한 오해가있을 수 있습니다. 하위 클래스의 ivars를 덮어 쓰시겠습니까? –

+0

아니요, 아무 것도 무시하고 싶지 않습니다. –

답변

0

이 ivars는 @public 또는 @protected로 표시됩니다. 예, 정확하게 동일합니다.

+0

하지만 MyDerivedObj 할당은 어떻게해야합니까? 내가 찾고있는 것은 1000 개의 모든 ivars를 설정하는 빠른 방법입니다. –

+0

배열을 사용하십시오 ... –

1

본질적으로 개체의 모든 인스턴스에는 다른 ID가 있습니다. 다른 주소와 힙의 다른 할당 지점.

따라서 A의 인스턴스 변수와 B 의 인스턴스 변수는 항상 다른 위치에 있습니다..

이제 A와 B의 인스턴스 변수를 별도로 할당 된 구조체에 래핑 할 수없는 이유는 없습니다. 그러면 A와 B 둘 다 값으로 가득 찬 구조체의 단일 복사본에 대한 포인터 인 인스턴스 변수를 가질 수 있습니다.

모든 1,000 개의 ivars를 설정하는 측면에서 설정하려는 항목에 따라 다릅니다. 0이면 객체 인스턴스화시 자동으로 설정됩니다. bcopy()에 템플리트 된 값 세트를 사용하려면 구조에 대한 포인터를 사용하고 별도의 할당을 수행하는 것이 좋습니다. 결국 객체를 인스턴스화하지 않고 객체의 인스턴스 변수를 대량 설정하는 방법은 없습니다.

1

이 ivars는 모두 분리되어야합니까? 비슷한 문제가 있다면 첫 번째 본능을 일종의 컬렉션 ivar (NS (Mutable) Array/Dictionary/Set)로 마무리 한 다음 정상적인 getter/setter를 사용하여 수행 할 수 있습니다.

myDerivedObj.collection = myObj.collection; 

컬렉션이 "할당"메모리 관리 정책을 사용하는 MyObj 클래스의 속성이라고 가정하면이 참조는 메모리 참조를 보존해야한다고 생각합니다.

(나는 아직도 가지 새로운이에, 그래서 어떤 결함을 격추/내 논리의 오류.) 당신이 부모 클래스 MyClass위한 '복사 생성자'스타일 initialiser를 작성하고 호출 제안

+0

동의, 이것은 훨씬 더 큰 문제를 암시하는 질문처럼 보입니다. WHO에는 클래스에서 수천 개의 인스턴스 변수가 필요합니까 ?? –

+0

나는 1000 마리의 ivars가 없다. 나는 기본적인 문제를 명확하게하기 위해 과장했다. 요점은 ivars가 충분히 많다는 것입니다. (그리고 기본 클래스는 변경하기에 충분할 것입니다.) 하나씩 복사해야한다면, 대신해야 할 일은 서브 클래 싱없이 모든 것을 접근하는 것입니다. –

0

그 자식 클래스에서 MyDerivedClass 이니셜 라이저. 여기

[MyDerivedClass initByCopying:someMyObject plusSomeNewProperties:stuff] -> 
    [MyClass initByCopying:someMyObject] -> 
    [NSObject init] -> // alloc, etc. 

어떤 의사이다 : 나는 1000 개 멤버 항목이있는 경우 당신이 만드는 것이다, 성능에 민감한 사람하지만, 모든 속성 가방이나 KVC 사용을 고려할 수 있다는 의심

@interface MyClass : NSObject { 
    int AA; 
    // ... 
    int ZZ; 
} 
@end 

@implementation MyClass 

-initByCopying:(MyClass*)other; 
{ 
    if (self = [super init]) 
    { 
    self.AA=other.AA; 
    //... 
    self.ZZ=other.ZZ; 
    } 
    return self; 
} 

@end 

@interface MyDerivedClass { 
    int AAA; 
} 
@end 

@implementation MyDerivedClass 

-initByCopying:(MyClass*)other withNewValue:(int)newVar; 
{ 
    if (self = [super initByCopying:(MyClass*)other]) 
    { 
    self.AAA = newVar; 
    } 
    return self; 
} 

@end 

당신의 initByCopying 루틴은 훨씬 간단합니다.

복사 프로토콜을 사용하여 복사 생성자를 구현하기위한 바로 가기가있을 수 있지만 위의 예보다 쉽게 ​​만드는 방법을 볼 수 없습니다.