2010-05-19 1 views
1

아래 코드는 의사 코드입니다. 과일을 만드는 공장 방법이있는 "과일"클래스를 상상해보십시오.Objective-C 기본 : 하위 클래스 지정 및 멤버 변수 액세스 가능성

interface Fruit 
{ 
} 
+(Fruit*) createFruit: 
{ 
    return [[Fruit alloc] init autorelease]; 
} 

지금은 애플을 얻기 위해 과일을 서브 클래 싱 할 :

interface Apple : Fruit 
{ 
int iSeeds; 
} 
+(Apple*) createAppleWithColor: (int) iSeeds 
{ 
Apple* oApple = [Apple createFruit:]; 
oApple.iSeeds = iSeeds; 
return oApple; 
} 

질문 :

  • 가 어떻게 그것이 외부에서 변경할 수 없습니다 "iSeeds"개인 있도록 만들 수 있습니까? "비공개"키워드를 추가하면 더 이상 생성되지 않습니다.
  • 여전히 Apple의 공장 방법에서 iSeed를 설정하고 싶습니다.
  • 사용자가 iSeeds의 내용을 읽을 수있게하고 싶습니다. 그래서 나는 getter를 가져야한다고 생각하지만 작동하도록 할 수는 없습니다. 나는 항상 "LValue assignment"에 관해 약간의 오류를 얻는다.
  • 과일의 생성 과일은 자동 방출을 사용하고 있습니다. 애플은 아무것도 준비하지 않았습니까?

르네

답변

1

몇 가지.

  1. createFruit 메서드가 잘못되었습니다. 그것은해야한다 :

    + (Fruit *) createFruit { 
        //autorelease, because the Create Rule only applies to CoreFoundation functions 
        return [[[Fruit alloc] init] autorelease]; 
    }
  2. 인스턴스 변수는 기본적으로 @protected 있습니다. 즉, 클래스 및 하위 클래스에서 직접 액세스 할 수 있습니다. @protected, @private, @public@package으로 만들 수 있습니다.

    @interface Apple : Fruit { 
        @private 
        int iSeed 
    } 
    ... 
    @end
  3. 당신이 인스턴스 변수는 읽기 전용, 다음 @public로 선언하지 않는 수 있도록하려면,하지만 그것을 위해 게터을 :이처럼 그렇게. 예 :

  4. 그러나 인스턴스 변수는 읽기 전용이므로 외부에서 설정할 수 없습니다. 이 주위에 방법은 초기화하는 동안 애플에게 iSeed 값을 제공하는 것입니다 : 당신이 Naming Conventions guideMemory Management guide을 읽어야한다, 마지막으로

    + (Fruit *) createAppleWithColor:(int)iSeeds { 
        return [[[Apple alloc] initWithSeeds:iSeeds] autorelease]; 
    }
  5. :

    - (id) initWithSeeds:(int)aniSeedValue { 
        if (self = [super init]) { 
        iSeed = aniSeedValue; 
        } 
        return self; 
    }

    는 다음처럼 createAppleWithColor:(int)iSeeds 방법을 확인하십시오.

+0

편의 생성자는 일반적으로 단지'fruit' 것 : 물론

Fruit* apple = [Apple fruit]; 

, 당신은 -initWithSeeds를 호출 한 후 iSeeds에 적합한 기본값을 제공하고 애플에 대한 초기화 방법을 제공해야합니다. – Chuck

+0

@Chuck, 동의 함. 방금 명명 컨벤션을 체크 아웃하는 링크를 추가했습니다. –

+0

알겠습니다. 나는 아직도 배울 것이 많다. 명명 규칙에 관해 : 나는 그들과 함께 살 수 있는지 알아야 할 것입니다. 나는 C#에서 왔고 현재이 모호한 ObjectiveC 스타일을 받아들이 려하지 않지만 결국에는 그것을 채택 할 것입니다. :-) 나는 전혀 얻지 못하는 것들 : "createAppleWithColor"는 애플 클래스의 한 메서드입니다. 왜 애플의 iSeed 멤버에 액세스 할 수 없습니까? C#에서는 메서드가 정적인지 여부는 중요하지 않지만 여전히 클래스의 멤버입니다. – Krumelur

1

한 가지 더. 당신이 공장 클래스에 적용하는 방법 및 그 서브 클래스가있는 경우, 당신은 (아마도해야한다)이 작업을 수행 할 수 있습니다

+(Fruit*) fruit 
{ 
    [[[self alloc] init] autorelease]; 
} 

이 서브 클래스와 메소드를 호출 할 경우, 당신의 객체를 얻을 것이다 것을 의미한다 올바른 유형 예

관련 문제