iOS Programlama kitabının ikinci bölümünde, Joe Conway alt sınıflandırma durumunda sınıf yöntemlerinde 'kendini' kullanmayı açıklar. Bu kavramı anlıyorum ve alt sınıflama konusunda bir sorum var.Bir alt sınıftaki bir Objective-C'deki sınıf yöntemini düzgün bir şekilde nasıl geçersiz kılarım?
Amaç: Biz kimin sınıf yöntemi + randomPossession şöyle bir bulundurmak sınıfını yarattı:
+(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];
}
ben dönüş değeri gerçekten tip id olmalıdır farkındayım öyle ki id newPossession = ...
Ben Topla sınıflandırma ve yeni Ivar, markası, şöyle ben BallGlove içinde + randomPossession overrode bir NSString *
dahil bir sınıf olarak adlandırılan BallGlove oluşturuldu:
+(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;
}
Sorum şu: Bu sınıf yönteminin, topluluk tarafından uygun ve kabul edilebilir şekilde geçersiz kılındığı yöntem (örn. bir değişkende süper uygulamayı yakalayarak -init formatına paralel olarak, değişkeni buna göre manipüle eder ve sonra geri gönderir? Çıktılarım, döndürülen nesnenin bir BallGlove örneğidir, ancak kabul edilebilir uygulamaya ilgi duyuyordum. Şimdiden teşekkürler.
+ randomPossession aslında belirtilen başlatıcıyı çağırır. Sınıf yöntemi, bu başlatıcı için "rasgele" değerler de oluşturur. Eğer önerdiğini düşündüğüm şeyi yaparsam, override sınıf yöntemindeki (rasgele) "rastgele" değerlerin kodunu çoğaltmalı ve BallGlove sınıfının yeni bir başlatıcısını çağırmak için belirlenen başlatıcıyı geçersiz kılmalıydım. ek iVar bilgilerimi ekle. Genel anlamda zararlı önerdiğim gibi sınıf yöntemini neden geçersiz kılıyor? Başlatıcıları zincirlemek mümkün değil mi? –
Bunun çok çirkin olduğunu düşünmüyorum - sadece çok yaygın bir model değil. Sorunun kendisi bunun için iyi bir göstergedir. :) Alt sınıflama ile biraz belirsiz olan bir şey yöntemin adıdır ve iyi adlandırma objektif-c hakkında en iyi şeylerden biridir. Bu durumda, bir yöntem + randomBallGlove, geçersiz kılmaktan daha iyi olabilir. – Eiko
Bunun yerine, istenen özel uygulamaya ek olarak + randomPossession uygulamasının kullanılmasını içeren + randomBallGlove adlı bir sınıf yöntemi oluşturduğumu mu söylüyorsunuz? Bana uyar. + RandomPossession için hala sahip olma alt sınıflarına sunulmak için ne önerirsiniz? yöntemi geçersiz kılın ve + randomBallGlove'nin bir yönlendirme yönlendirme kullanmasını sağlayın? Bu genellikle bu tür olayların normal protokolü mü?Bu örneğin gerçekte varolmayan olabileceğini biliyorum, sadece öğrendim ve olayın gerçekleştiği yerde uygulamayı kabul ettiğim için merak ediyorum. Yardım ettiğin için teşekkür ederim! –