Trong chương thứ hai của cuốn sách Lập trình iOS của mình, Joe Conway mô tả bằng cách sử dụng 'self' trong các phương thức lớp trong trường hợp phân lớp con. Tôi hiểu khái niệm này và có một câu hỏi về vấn đề phân lớp.Làm cách nào để ghi đè đúng một phương thức lớp trong một Objective-C trong một lớp con?
Bối cảnh: Chúng tôi tạo ra một lớp Kiểm soát bóng mà phương pháp lớp + randomPossession trông như thế này:
+(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];
}
Tôi biết rằng giá trị trả thực sự cần là kiểu id mà id newPossession = ...
tôi subclassed Kiểm soát bóng và tạo ra một lớp được gọi là BallGlove bao gồm một Ivar mới, thương hiệu, một NSString *
tôi overrode các + randomPossession trong BallGlove như sau:
+(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;
}
Câu hỏi của tôi là: Cách thức tôi vượt qua phương pháp lớp này phù hợp và được chấp nhận bởi cộng đồng (tức là song song định dạng -init bằng cách chụp siêu thực hiện trong một biến, thao tác biến cho phù hợp và sau đó trả về nó? Đầu ra của tôi cho thấy rằng đối tượng được trả về là một thể hiện của BallGlove tuy nhiên, tôi đã quan tâm đến việc thực thi có thể chấp nhận được. Cảm ơn trước.
+ randomPossession trong lớp cơ sở trong thực tế gọi initializer được chỉ định. Phương thức lớp cũng tạo ra các giá trị "ngẫu nhiên" cho bộ khởi tạo đó. Nếu tôi làm những gì tôi tin rằng bạn đang gợi ý, tôi sẽ phải sao chép mã cho các giá trị "ngẫu nhiên" trong phương thức lớp đã ghi đè (+ randomPossession) cũng như ghi đè trình khởi tạo được chỉ định để gọi trình khởi tạo mới của lớp BallGlove, thêm thông tin iVar bổ sung của tôi. Tại sao lại ghi đè phương pháp lớp học khi tôi đề xuất bất lợi theo nghĩa chung? Nó không thể được so sánh với chuỗi khởi tạo? –
Tôi không nghĩ rằng nó quá xấu xí - nó không chỉ là một mô hình rất phổ biến. Câu hỏi chính nó là một chỉ báo tốt cho điều đó. :) Một điều có chút mơ hồ với phân lớp là tên của phương thức, và việc đặt tên tốt là một trong những điều tốt nhất về mục tiêu-c. Vì vậy, trong trường hợp của bạn, một phương thức + randomBallGlove có thể tốt hơn là ghi đè. – Eiko
Bạn đang gợi ý rằng tôi thay vì tạo một phương thức lớp có tên là + randomBallGlove bao gồm việc thực hiện + randomPossession ngoài việc triển khai tùy chỉnh mong muốn? Nghe hay đấy. Bạn đề xuất gì cho + randomPossession vẫn có sẵn cho các lớp con của Possession? ghi đè lên phương pháp và có nó ném một ngoại lệ chỉ đạo sử dụng + randomBallGlove? Đây có phải là giao thức bình thường của các sự kiện như vậy không?Tôi biết ví dụ này có thể không tồn tại trong thực tế, tôi chỉ học hỏi và tò mò muốn chấp nhận thực hiện trong trường hợp nó xảy ra. Cảm ơn bạn đã giúp đỡ! –