iOS 프로그래밍 책의 두 번째 장에서 Joe Conway는 서브 클래 싱하는 경우 클래스 메서드에서 'self'를 사용하는 방법을 설명합니다. 이 개념을 이해하고 서브 클래 싱 문제에 대해 질문합니다.하위 클래스의 Objective-C 클래스 메서드를 제대로 재정의하려면 어떻게해야합니까?
배경 : 우리는 누구의 클래스 메소드 + randomPossession이처럼 보이는 점유율 클래스를 생성 :
+(id)randomPossession
{
NSArray *randomAdjectiveList = [NSArray arrayWithObjects:@"Fluffy", @"Rusty", @"Shiny", nil];
NSArray *randomNounList = [NSArray arrayWithObjects:@"Bear", @"Spork", @"Mac", nil];
unsigned long adjectiveIndex = rand() % [randomAdjectiveList count];
unsigned long nounIndex = rand() % [randomNounList count];
NSString *randomName = [NSString stringWithFormat:@"%@ %@", [randomAdjectiveList objectAtIndex:adjectiveIndex], [randomNounList objectAtIndex:nounIndex]];
int randomValue = rand() % 100;
NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c",
'0' + rand() % 10,
'A' + rand() % 10,
'0' + rand() % 10,
'A' + rand() % 10,
'0' + rand() % 10];
Possession *newPossession = [[self alloc] initWithPossessionName:randomName valueInDollars:randomValue serialNumber:randomSerialNumber];
return [newPossession autorelease];
}
내가 반환 값은 정말 id 형식이어야한다는 것을 알고 같은 해당 ID newPossession = ...
나는 점유율을 서브 클래스하고 새로운 바르, 한 brandname 다음과 같이 내가 BallGlove에 + randomPossession를 오버라이드있는 NSString *
를 포함하는 클래스라는 BallGlove 생성 :
를+(id)randomPossession
{
BallGlove *myGlove = [super randomPossession];
NSArray *brandNames = [NSArray arrayWithObjects:@"Rawlings", @"Mizuno", @"Wilson", nil];
unsigned long randomNameIndex = rand() % [brandNames count];
[myGlove setBrandName:[brandNames objectAtIndex:randomNameIndex]];
NSLog(@"myGlove is of type class: %@", [self class]);
return myGlove;
}
내 질문은 다음과 같습니다.이 수업 방법을 커뮤니티가 적절하고 수용 할 수있는 방식 (즉, 변수에서 슈퍼 구현을 캡처하여 해당 형식을 병렬 처리하고 그에 따라 변수를 조작 한 다음이를 리턴하십시오. 내 결과는 반환 된 객체가 BallGlove의 인스턴스임을 보여 줬지만 만족스러운 구현에 관심이있었습니다. 미리 감사드립니다.
+ 기본 클래스의 randomPossession은 실제로 지정된 초기화 프로그램을 호출합니다. 클래스 메서드는 또한 해당 이니셜 라이저에 대해 "임의"값을 만듭니다. 내가 생각하는 바를 믿는다면 오버라이드 된 클래스 메소드 (+ randomPossession)에서 "임의"값에 대한 코드를 복제하고 지정된 이니셜 라이저를 재정 의하여 BallGlove 클래스의 새 초기화 프로그램을 호출해야합니다. 내 추가 iVar 정보를 추가하십시오. 왜 일반적인 방법으로 해로운 제안 클래스 메서드를 무시 무엇입니까? 체인 이니셜 라이저에 비유 될 수 없는가? –
지나치게 추한 것 같지 않습니다. 아주 일반적인 패턴이 아닙니다. 질문 자체가 그 좋은 지표입니다. :) 서브 클래 싱 (subclassing)으로 다소 애매한 것은 메소드의 이름이며, 좋은 네이밍은 objective-c에 관한 최상의 것들 중 하나입니다. 따라서 귀하의 경우 + randomBallGlove 메서드가 재정의하는 것보다 낫습니다. – Eiko
대신 + randomPossession의 구현과 원하는 구현을 포함하는 + randomBallGlove라는 클래스 메서드를 만드는 것이 좋습니다. 나에게 좋은 소리. Possession의 하위 클래스에서 + randomPossession을 계속 사용할 수 있다고 제안 하시겠습니까? 메서드를 재정의하고 + randomBallGlove의 사용을 지시하는 예외를 throw합니까? 일반적으로 이러한 이벤트의 일반적인 프로토콜입니까?나는이 예가 실제로 존재하지 않을 수도 있음을 알고 있으며, 나는 단지 배웠고 일어난 사건에서 받아 들여진 구현에 관해서 궁금하다. 당신의 도움을 주셔서 감사합니다! –