2012-04-01 4 views
0

저는 데이터 보관에 대해 공부하고 있습니다. 표준 컬렉션 클래스는 쉬운 보관을 제공하지만, NSMutableArray을 보관하려고합니다. 그래서 NSMutableArray이 "NSArray"이기 때문에 서브 클래스이기 때문에 읽었습니다. 그렇다면 이것은 괜찮습니다.서브 클래스 "is"클래스가 혼란 스럽습니다

그러나 그 생각은 나를 괴롭 히고, 이것이 Objective-C의 기본 개념이라는 것을 깨닫기 때문에 나는 올바르게 이해하고 싶습니다.

"jeep"하위 클래스가있는 "automobile"클래스가 있다고 가정 해보십시오. 이제 위의에 따라, 당신은 이런 말을 할 수

automobileInstance=jeepInstance;

을 ... 지프가 자동차의 서브 클래스이기 때문이다.

그러나 이것은 나에게 거꾸로 보인다. 난 당신이 대신 서브 클래스의 인스턴스가 슈퍼 클래스 인스턴스와 같은 될 수 있다는 말을해야한다고 생각합니다 :

지프 = 자동에게

모든 지프 후 자동차의 "는"전부는 아니지만 자동차는 지프 때문이다.

은 왜 당신은이 작업을 수행 할 수 있습니다

NSArray*newArray=nsmutableArrayInstance;

그것은 같은 생각의 말 :

automobile=jeep; 내 예에.

예를 들어, 하위 클래스에 새 인스턴스 변수가 많이 추가되었을 수 있지만 수퍼 클래스와 같게 설정하면 해당 iVars가 "손실"되거나 수퍼 클래스가 인식하지 못하기 때문에 그렇지 않습니다. 진정으로 물체를 잡으면, 그것은 보일 것입니다.

수퍼 클래스의 모든 항목이 서브 클래스에 있으므로 sublass instance = superclass instance을 말하는 것이 좋습니다. 하위 클래스에 있지만 슈퍼 클래스에는없는 추가 iVars에 대한 값을 얻지 못하면 기본값은 0으로 설정 될 수 있지만 적어도 존재합니다.

+1

Objective-C는 영어의 문장 구조를 따르지 않습니다. –

+2

자동차 주차 공간이 있다고 생각하십시오. 지프는 거기에 갈 수있어, 지프는 자동차 다. 그러나 당신이 지프를 위해 주차 자리를 특별히 가지고 있으면, 당신은 단지 그것에 낡았 던 닥치는대로의 자동차를 찔리지 않을 수 있었다, 그렇지? 그것은 지프가 아닐 수도 있습니다. 이제 Automobile * auto가 자동차를 놓을 곳을 선언한다고 생각하십시오 (기술적으로 자동차에 대한 포인터이지만, 그렇습니다). 네가 원하면 주차 장소. – cHao

답변

1

이렇게 생각하십시오. 모든 지프는 자동차입니다. 모든 자동차가 지프입니다. 따라서 다음과 같이 말할 수 있습니다 :

Automobile a = jeepInstance; // 지프는 항상 자동차

하지만되지 않습니다 :

지프 J = autoInstance; // fails - autoInstance가 Mazda 일 수 있습니다.

1

수퍼 클래스의 클래스 멤버가 항상 하위 클래스에 있기 때문에 수퍼 클래스 포인터는 해당 하위 클래스에서 할당 한 개체를 가리킬 수 있습니다.

autoMobilePointer = jeepObject; // works 

하위 클래스에는 수퍼 클래스에없는 멤버가 있기 때문에 다른 방법은 아닙니다.

jeepPointer = autoMobileObject; // doesn't work 
+0

기본적으로 첫 번째 예에서 새 자동 포인터는 지프 – johnbakers

+0

의 멤버를 잃어 버리기 때문에 autoMobilePointer를 통해 액세스 할 수 없습니다. 그 포인터를 jeepPointer에 던지면 jeepObject가 결국 메모리에 할당 한 것입니다. –

1

여기 문제는 할당과 평등, 그리고 클래스와 객체가 혼동 스럽다는 것입니다. =은 할당을 의미하는 반면, ==-isEqual은 동등성 테스트입니다.B가 A의 하위 클래스 인 경우 모든 A이며, 모든 지프 자동차이며, 모든 사람 포유 동물입니다.

그러나 당신이 말할 때 :

automobile = jeep; 

당신이하고있는 것은 변수 automobile-jeep의 값을 할당 입니다. You''re 가 아니라는 세계의 모든 자동차가 지프 다라고 말하는 것은 특정의 변수 automobile가 지프의 특정의 인스턴스를 가리킨다 고 말하는 것이다. 정확히 내가 물어 본 것과 같습니다 :

어떤 자동차를 운전합니까?

내 머리 속에는 자동차에 대한 정보로 답장을 보내주기를 기대합니다. 당신이 대답을 위해 예약 한 내 머리 속에있는 메모리 위치는 어떤 차를 가리킬 수도 있기 때문에 Automobile* 타입을 가지고 있다고 말할 수 있습니다. 너는 대답했다 :

나는 나무 근처에 주차 된 빨간 지프를 운전한다.

변수에 대해 더 구체적인 이름을 선택하는 것이 도움이 될 수 있습니다. 다음과 같이 구체적인 내용을 사용하십시오.

이렇게하면 모든 차량이 아닌 특정 차량에 대해 이야기하는 것이 분명해집니다.

관련 문제