2012-05-14 29 views
6

Tôi đang cố gắng sử dụng một số NSInvocation để gọi một phương thức siêu lớp từ lớp con. Mã tham gia là tương đối đơn giản, nó đi như thế:iOS - Không thể sử dụng 'siêu' làm tham chiếu?

- (NSInvocation*) invocationWithSelector:(SEL)selector { 
    NSInvocation* call = [[NSInvocation alloc] init]; 
    [call retainArguments]; 
    call.target = super; //ERROR: use of undeclared identifier 'super' 

    call.selector = @selector(selector); 

    return call; 
} 

này có vẻ hơi lạ với tôi, như tôi đã luôn luôn giả định rằng super theo khá nhiều quy tắc tương tự như self (tức là nó có thể được coi như một trực tiếp tham chiếu đến đối tượng được đề cập và được gán cho các biến, được sử dụng làm giá trị trả về, v.v.). Có vẻ như đây không phải là trường hợp trong thực tế. Nhưng dù sao, có cách nào đơn giản để có được NSInvocation để nhắm mục tiêu thực hiện siêu lớp (tôi không thể sử dụng self làm mục tiêu, vì lớp con ghi đè các phương thức siêu lớp) hay tôi cần tìm một số cách tiếp cận khác?

+0

self.superclass có hoạt động không? (chỉ cần đoán ở đây ...) – Pochi

Trả lời

9

Xem What exactly is super in Objective-C? để biết thêm thông tin, nhưng siêu thực sự không phải là đối tượng. Siêu là một từ khóa cho trình biên dịch để tạo ra các cuộc gọi thời gian chạy obj-c (cụ thể là objc_msgSendSuper). Về cơ bản, nó giống như đúc lớp của bạn đến lớp cha của nó trước khi gửi tin nhắn.

EDIT Vì vậy, nếu bạn đã ghi đè phương thức bạn muốn gọi, bạn sẽ phải viết một phương thức khác để gọi [super method] trực tiếp và đặt lời gọi của bạn để gọi phương thức đó. Thời gian chạy sẽ chỉ gửi tin nhắn đến các đối tượng và chúng sẽ được xử lý ở thành viên thấp nhất của chuỗi kế thừa thực hiện chúng.

+0

Thú vị, về cơ bản bạn không thể gián tiếp gọi một phương thức siêu lớp bằng cách sử dụng 'NSInvocation' hoặc' performSelector ... 'nếu lớp con của bạn cung cấp việc thực hiện riêng của phương thức đích? Điều đó có vẻ như một chút hạn chế. – aroth

+0

Có phải không? Có C + + hoặc một ngôn ngữ dựa trên C cho phép bạn làm điều này? Ý tôi là, nếu bạn ghi đè lên chức năng nó có nghĩa là bạn muốn hành vi trên lớp của bạn khác với lớp của lớp cha của nó (hoặc ngoài lớp cha của nó). Nếu đây không phải là ý tưởng chính xác thì tôi cho rằng tôi có một lỗ hổng cơ bản trong sự hiểu biết của tôi về OOP. – borrrden

+0

Không, nó không xuất hiện mà các ngôn ngữ khác cho phép điều này (chỉ cần thử với Java, cùng một vấn đề). Nhưng bạn nhấn điểm quan trọng với "_in của bạn thêm vào đó của bình luận của cha mẹ class_" của nó. Lớp con có khả năng gọi một cách rõ ràng việc thực hiện siêu lớp của một phương thức ghi đè, vì nó cũng nên. Và vì lý do đó tôi không thấy lý do hợp lý nào tại sao nó không thể làm điều tương tự bằng cách sử dụng lệnh 'NSInvocation' hoặc' performSelector ... '. Trong ngắn hạn, tôi không nghĩ rằng nó có ý nghĩa cho các cuộc gọi đến việc thực hiện superclass để yêu cầu một lời gọi rõ ràng/ngay lập tức. – aroth

1

superself là cùng một đối tượng, vì vậy chỉ cần sử dụng

call.target = self; 

Sự khác biệt giữa chúng là bạn có thể sử dụng super như một máy thu của một thông điệp tới self như một cách để đảm bảo rằng nó sẽ gọi cha ' thực hiện.

+0

Ý của bạn là nhập "tự"? – borrrden

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