2012-08-06 34 views
6

Tôi mong đợi [super class] để trả lại lớp của lớp học, tuy nhiên tôi đã tìm thấy, sử dụng mã này để trả về lớp của lớp này.Tại sao "[self class] == [super class]"?

NSLogObject([self class]); 
NSLogObject([super class]); 
NSLogObject([self superclass]); 
NSLogBool([self class] == [super class]); 

Output

[self class]: MainMenuScene 
[super class]: MainMenuScene 
[self superclass]: CCScene 
[self class] == [super class]:[YES] 

ai đó có thể giải thích lý do tại sao điều này xảy ra xin vui lòng ?. Tôi hy vọng nó sẽ trả về cùng một giá trị như [self superclass].

Macros: 
------- 
#define NSLogBool(i) NSLog(@"%s:[%@]", #i, (i) ? @"YES" : @"NO") 
#define NSLogObject(o) NSLog(@"%s:[%@]", #o, o) 
+2

Và chỉ trong trường hợp tôi không nói "lớp" đủ: "Lớp học lớp lớp học!" –

+0

Bạn không nên sử dụng tiền tố của apple trong các lớp hoặc macro của riêng bạn (hoặc chỉ bất kỳ số nhận dạng nào khác) – JustSid

+1

Tôi nên nếu tôi muốn chúng hiển thị khi tôi nhập NSLog ...: P –

Trả lời

6

[super class] gọi phương thức super trên dụ hiện tại (ví dụ: self). Nếu bản thân có một phiên bản ghi đè, thì nó sẽ được gọi và nó sẽ trông khác. Vì bạn không ghi đè lên, hãy gọi số [self class] giống như gọi số [super class].

+0

Cảm ơn. Tôi chỉ là dozy và giả sử một phương pháp gọi là "lớp" bằng cách nào đó sẽ hành động khác với phần còn lại của oop! –

+0

Tôi thừa nhận tôi rơi vào cùng một cái bẫy trong một giây trong khi đọc câu hỏi của bạn. Đừng lo lắng. – mprivat

+1

ngay cả khi bạn không ghi đè lên nó, có thể là '[self class]' không giống như '[super class]', nếu 'self' là một cá thể của một lớp con ghi đè phương thức; sau đó nó sẽ gọi thực hiện của lớp con – newacct

2

super đề cập đến việc triển khai phương pháp trong siêu lớp. Nếu bạn không ghi đè lên phương thức trong lớp của bạn, việc thực thi trong lớp của bạn và lớp cha của nó là như nhau.

Cả hai [super class][self class] gọi cùng một phương pháp, được xác định trên NSObject.

+1

ngay cả khi bạn không ghi đè lên nó, có thể là '[self class]' không giống như '[super class]', nếu 'self' là một cá thể của một lớp con ghi đè phương thức; sau đó nó sẽ gọi thực hiện của lớp con – newacct

+0

@newacct tôi biết. – Sulthan

0

Trong khi câu trả lời bằng mprivat và Sulthan là chính xác về mặt kỹ thuật, trường hợp hiện nay là một chút phức tạp hơn (và thú vị):

Xét việc thực hiện cuộc gọi đến phương pháp này. Nó sử dụng (tất nhiên) con trỏ đối tượng. Một con trỏ đối tượng là một con trỏ tới một cấu trúc có phần tử đầu tiên của nó (isa) là một con trỏ đến lớp đối tượng. Các phương thức class (nghĩa là, như mprivat và Sulthan đã tuyên bố chính xác, giống nhau trong cả hai trường hợp) theo con trỏ này để xác định lớp, tức là luôn là lớp của đối tượng gọi.

Kết quả là, nếu A là lớp cha của B, cả hai gọi [self class][super class] gọi bằng một thể hiện của B, trả lại lớp B (không của A, những gì người ta có thể mong đợi vì một ghi đè mất tích!).