W drugim rozdziale książki o programowaniu w iOS Joe Conway opisuje użycie "ja" w metodach klasowych w przypadku podklasy. Rozumiem tę koncepcję i mam pytanie dotyczące kwestii podklasy.Jak poprawnie zastąpić metodę klasy w Objective-C w podklasie?
Tło: My stworzyliśmy klasę Possession którego metoda klasy + randomPossession wygląda tak:
+(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];
}
Jestem świadomy, że wartość zwracana naprawdę powinny być typu id tak, że id newPossession = ...
i podklasy Possession i stworzył klasę o nazwie BallGlove które obejmowały nową Ivar, marką, NSString *
i overrode + randomPossession w BallGlove następująco:
+(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;
}
Moje pytanie brzmi następująco: Czy sposób, w jaki przeważyłem tę metodę klasy, jest odpowiedni i akceptowany przez społeczność (tj. równolegle do formatu -init przechwytując super implementację w zmiennej, odpowiednio manipulować zmienną, a następnie ją zwrócić? Moje wyniki pokazują, że zwracany obiekt jest instancją BallGlove, ale byłem zainteresowany akceptowalną implementacją. Z góry dziękuję.
+ randomPosesja w klasie bazowej w rzeczywistości wywołuje wskazany inicjator. Metoda klasy również tworzy "losowe" wartości dla tego inicjatora. Jeśli zrobię to, co moim zdaniem sugerujesz, będę musiał skopiować kod dla tych "losowych" wartości w nadpisanej klasie (+ randomPossession), a także nadpisać wyznaczony inicjator, aby wywołać nowy inicjator klasy BallGlove, który dodaj moje dodatkowe informacje iVar. Dlaczego nadpisuje się metodę klasową, którą zaproponowałem jako szkodliwą w sensie ogólnym? Czy nie można go porównać do inicjowania łańcuchów inicjalizujących? –
Nie sądzę, że to zbyt brzydkie - to po prostu nie jest bardzo powszechny wzór. Samo pytanie jest tego dobrym wskaźnikiem. :) Jedną rzeczą, która jest nieco niejasna z podklasą, jest nazwa metody, a dobre nazywanie jest jedną z najlepszych rzeczy na temat celu-c. W twoim przypadku metoda + randomBallGlove może być lepsza niż przesłonięcie. – Eiko
Sugerujesz, że zamiast tego tworzę metodę klasy o nazwie + randomBallGlove, która obejmuje implementację + randomPossession i pożądaną implementację niestandardową? Brzmi dobrze jak dla mnie. Co sugerujesz, aby + randomPossession nadal był dostępny dla podklas Posiadanie? zastąpić metodę i czy rzuca wyjątek kierując użycie + randomBallGlove? Czy jest to zazwyczaj normalny protokół takich wydarzeń?Wiem, że ten przykład może nie istnieć w rzeczywistości, po prostu się uczę i jestem ciekawy co do zaakceptowanej implementacji w przypadku, gdyby tak się stało. Dzięki za pomoc! –