我有一個A
類,其實例變量類型爲X
。在子類中向下轉換Objective-C實例變量
@interface A : NSObject {
X *x;
}
@end
一些X
實例的附加符合的協議P
。我想要爲那些X
實例專門實現A
版本。
@interface B : A {
X <P> *x;
}
@end
這編譯得很好。但是,當我從B
實例訪問x
時,更改不會傳播到A
。因此,未重新定義的A
的功能使用其他X
實例,而不是B
的功能。
當僅添加協議時是否可以重新定義實例變量? 有關於亞類的類似question。但是,子類和協議並不相同。雖然我的方法編譯得很好,但它不能按預期工作。
如果這是不可能的:是否有共同的模式來執行此操作?
如果我不重寫新類型的實例變量,代碼凌亂難看的東西:如果我重寫實例變量
[((X <P> *)x) methodOfP]
,我將更改傳播自己到超類
A
。這需要額外的功能。使用一個屬性而不是一個實例變量:這是否會生效?一個屬性是否可以在一個子類中重新定義?
@interface A : NSObject { X *x; } @property (strong, nonatomic) X *x; @end @implementation A - (X *)x { return x; } - (void)setX:(X *)anX { x = anX; } @end @interface B : A @property (strong, nonatomic) X <P> *x; @end @implementation B @end
是的,但' - setX:'的子類實現可能與基類中的不同,並且可能完全不同。 – Etan
另外,在我的情況下,只有'-x'方法公開地公開,因爲該屬性在公共頭中是隻讀的。 – Etan
「-setX:」的子類實現「完全不同」 - 恰恰違背了我指出的LSP。而你上面的代碼片段不會使屬性爲只讀。它沒有太大的區別。對於一個子類來說,它的約束比其超類更窄是沒有意義的。一個子類應該是一個超類型的,具有更廣泛的可能操作。也許你應該解釋真正的類和協議應該是什麼,以及爲什麼你要這樣做。我懷疑你濫用協議的概念。 –