(Objective C)如何在派生類中使用派生指針調用基類函數,其中foo被覆蓋。基本上相當於這個C++代碼通過派生指針調用基類函數
base* b_ptr = 0 ;
derived* d_ptr = new derived() ;
d->base::foo() ;
我會認爲這應該相當簡單。我需要使用選擇器嗎?
(Objective C)如何在派生類中使用派生指針調用基類函數,其中foo被覆蓋。基本上相當於這個C++代碼通過派生指針調用基類函數
base* b_ptr = 0 ;
derived* d_ptr = new derived() ;
d->base::foo() ;
我會認爲這應該相當簡單。我需要使用選擇器嗎?
你通常只會從類中做到這一點,使用super關鍵字
- (int)doSomething {
NSLog(@"calling doSomething on base class");
return [super doSomething];
}
然而,它仍可以從使用運行時函數objc_msgSendSuper類的外部去做,但它更麻煩一些, 。
#import <objc/objc-runtime.h>
...
Derived *d = [Derived new];
// call doSomething on derived class
[d doSomething];
// call doSomething on base class
struct objc_super b = {
.receiver = d,
.class = class_getSuperclass([d class])
};
objc_msgSendSuper(&b, @selector(doSomething));
}
你不知道。 Objective-C的面向對象的觀點與C++非常不同。這些不是「類功能」 - 它們是對象的方法。更重要的是,您不要直接調用它們 - 您將消息發送給對象,並且對象通過執行適當的方法進行響應。如果一個類選擇重寫一個方法,那麼它的實例將在接收到相應的消息時使用它的實現。直接調用一個方法實現會破壞封裝,如果沒有一些醜陋的黑客,你就無法做到這一點。
有一個有限的例外:在方法實現中,有兩個名稱用於引用當前對象。如果你說[self doSomething]
,那麼它會調用當前類的doSomething
方法。如果你寫[super doSomething]
,它會忽略它自己的實現並使用超類的方法。
謝謝。我沒有考慮過在運行時間來完成這項任務。看起來我有很多要學習的東西。 – 2009-12-08 10:11:58
這是因爲你*不應該*看運行時來完成這項任務。使用內部方法調度函數來規避語言應該工作的方式是令人討厭的。精心設計的代碼永遠不會需要這樣做。 – Chuck 2009-12-08 10:24:50