2012-06-27 126 views
4

可能重複:
Creating an abstract class in Objective C在Objective C中模擬抽象類和抽象方法?

在Java中,我喜歡使用抽象類,以確保一堆類具有相同的基本行爲,例如:

public abstract class A 
{ 
// this method is seen from outside and will be called by the user 
final public void doSomething() 
{ 
// ... here do some logic which is obligatory, e.g. clean up something so that 
// the inheriting classes did not have to bother with it 

reallyDoIt(); 
} 
// here the actual work is done 
protected abstract void reallyDoIt(); 

} 

現在如果B類繼承自A類,它只需要實現reallyDoIt()

如何在Objective C中做到這一點?這是否可能? Objective C中可行嗎?我的意思是Objective C中的整個範例似乎有所不同,例如從我的理解是沒有辦法禁止覆蓋一個方法(比如在Java中使用'final')?

謝謝!

+0

請參閱此主題[http://stackoverflow.com/questions/1034373/creating-an-abstract-class-in-objective-c](http://stackoverflow.com/questions/1034373/creating-an- abstract-class-in-objective-c) –

回答

10

對於不覆蓋目標c中的方法沒有實際限制。你可以像Dan Lister在他的回答中所建議的那樣使用一個協議,但這只是強制執行你的符合類來實現在該協議中聲明的某種行爲。

一種用於在目標C的抽象類的解決辦法是:

interface MyClass { 

} 

- (id) init; 

- (id) init { 
    [NSException raise:@"Invoked abstract method" format:@"Invoked abstract method"]; 
    return nil; 
} 

這樣就可以防止你的抽象類的方法被調用(但只能在不同於像Java可以檢測語言運行時這在編譯時)。

+0

謝謝,那其實我在想做的。我只是希望可以通過某種方式在編譯時告訴實現繼承類的程序員,該方法缺少一個方法,而不是在運行時。 – iseeall

+1

woulrdn't,使整個'如果(自我= [超級初始化]){...}返回自我;'在子類崩潰? – Kris

4

我想你會想要使用一種叫做Protocols的東西。

+2

+1您可能會補充說Objective-C是一種更強烈地依賴於約定而不是規則強制執行的語言。作爲一名開發人員,您必須遵守這些慣例才能使事情順利進行。 –

+5

協議[幾乎]等同於Java中的接口。所以這不是OP可能想要的。 – Eimantas

+0

我不認爲抽象類和協議完全相同。考慮:動物*鴨= [鴨新];協議不能像這樣的超類型。這種結構可以允許動態地將子類作爲參數。 – smileBot