2011-07-28 39 views
20

Tôi gặp một số khó khăn trong việc tìm ra giờ để ghi đè chính xác phương thức trong một trong các lớp con của tôi.Mục tiêu-C - Phương pháp ghi đè trong phân lớp

Tôi có lớp con (ClassB) của customclass khác (ClassA):

@interface ClassB : ClassA { 
} 

và trong ClassA, có một phương pháp gọi là:

-(void)methodName; 

bắn những viên đạn một cách chính xác.

Tuy nhiên, tôi cần phương pháp này để kích hoạt trong ClassB.

tôi đã cố gắng thực hiện (trong ClassB):

-(void)methodName { 
    [super methodName]; 
} 

nhưng nó vẫn sẽ không cháy trong ClassB.

Làm cách nào để ghi đè methodName để nó sẽ kích hoạt trong ClassB?

+0

Làm cách nào để bạn khởi tạo đối tượng? – Thys

Trả lời

25

Bạn chỉ cần thêm mã tùy chỉnh của bạn trong methodName trong ClassB:

- (void)methodName 
{ 
    // custom code 

    // call through to parent class implementation, if you want 
    [super methodName]; 
} 
+6

Đó chính xác là những gì anh ấy đã làm ... –

+3

Anh ấy không nói nơi anh ta thực sự đặt mã được thêm vào của mình .. Ngoài ra, đây là cách thực hiện đúng. –

+0

Bạn không phải xóa [super methodName]; để chạy methodName trong classB .. –

18

Trước tiên, hãy đảm bảo phương thức init của bạn tạo đối tượng ClassB chứ không phải đối tượng ClassA (hoặc thứ gì đó khác).

Sau đó, nếu bạn muốn tạo một ClassB (void) methodName hoàn toàn khác nhau: phương pháp so với cái được tìm thấy trong classA, đây là con đường để đi:

Siêu là lớp cha. Bằng cách gọi [super methodName], bạn đang yêu cầu ClassA thực thi methodName riêng của nó. Nếu bạn muốn ghi đè hoàn toàn methodName từ classA, chỉ cần không gọi super.

Vì vậy, về cơ bản, trong việc thực hiện của ClassB lại methodName:

-(void)methodName { 
    // Remove [super methodName] 
    // Insert the code you want for methodName in ClassB 
} 

Hãy đọc Messages to self and super trong The Objective-C tài liệu Ngôn ngữ lập trình của Apple.

+0

Đây có phải là câu trả lời đúng cho câu hỏi này không? – arqam

0

Bằng viết:

-(void)methodName { 
    [super methodName]; 
} 

Bạn nói với trình biên dịch: Khi thực hiện methodName của Class B, gọi methodName của lớp cha của nó (Lớp A). Vì vậy, nếu bạn muốn lớp B làm điều gì đó khác, bạn phải viết mã dẫn đến một hành vi khác. Như thế này:

-(void)methodName { 
    NSLog(@"Hello, world!"); 
} 

Bây giờ bằng cách gọi phương thứcTên lớp B "Xin chào, thế giới!" sẽ được in trên bảng điều khiển.

0
-(void)methodName { 
    [super methodName]; 
} 

Muốn gọi phương thứcName (trong ClassB), chỉ cần xóa [super method], sau đó bạn có thể kích hoạt. Nguyên nhân siêu là gọi lại cho ClassA

-1

Mặc dù câu hỏi này quá cũ, nhưng vẫn có một số người học hỏi như mọi chuyên gia, Sau đây được trích dẫn từ tài liệu của Apple. "Phương thức mới phải có cùng kiểu trả về và có cùng số lượng và loại tham số như phương pháp bạn đang ghi đè." câu trả lời đầy đủ có thể được tìm thấy trong Apple method overriding documentation Hy vọng điều này sẽ giúp ai đó.

+0

tràn ngăn xếp không được sao chép tất cả tài liệu. Vì OP không làm điều này sai, điều này không trả lời câu hỏi. – vikingosegundo

Các vấn đề liên quan