[Objective-c]インスタンス変数の書き方
第1回 ヘッダーファイルに書かない
第2回 カテゴリーを使う
《今回》第3回 クラスを継承する
第1回は、「実装ファイルにインスタンス変数を隠蔽する」をテーマにしました。
そして前回(第2回)は、「そのインスタンス変数をカテゴリーとして追加したメソッドから使えるか?」を調べましたが、結果は、「使えない」ということになりました。
そこで、「ヘッダーファイルに戻す」か「プロパティの宣言をするか」という2つの解決策を導きました。
今回は、“クラスを継承した時は、インスタンス変数は隠蔽したままでOKなのか?”を調べます。
スタートは、第1回の最終形からです。
1.(復習)BaseClass.h
@interface BaseClass : NSObject
@property (nonatomic) double BaseNumber;
-(void)setExponent:(double)exponentNumber;
-(double)calculate;
@end
2.(復習)BaseClass.m
#import "BaseClass.h"
@implementation BaseClass
{
double ExponentNumber;
}
@synthesize BaseNumber;
-(void)setExponent:(double)exponentNumber
{
ExponentNumber = exponentNumber;
}
-(double)calculate
{
return pow(BaseNumber, ExponentNumber);
}
@end
次に、BaseClassを継承する子クラスを作成します。
3.(子クラス)ChildClass.h
#import "BaseClass.h"
@interface ChildClass : BaseClass
@end
4.(子クラス)ChildClass.m
#import "ChildClass.h"
@implementation ChildClass
-(double)calculate
{
return log(ExponentNumber)/log(BaseNumber);
}
@end
案の定と言うか、やはりそうでしょうねぇと言うか・・・カテゴリーでダメなら継承でOKなはずがないのですね。
「Use of undeclared identifier ‘ExponentNumber’」
「Use of undeclared identifier ‘BaseNumber’」
とエラーが出ます。
return log(ExponentNumber)/log([self BaseNumber]);
とすれば、「BaseNumber」はエラーを回避できますが、「ExponentNumber」は無理です。
5.結論
「クラスを拡張する際には、インスタンス変数はヘッダーファイルに書くか、プロパティ宣言をする。」
ということになります。
Frameworkにした中で、ヘッダーファイルに一切の変数が出現していないファイルもあれば、結構な数の変数が露見しているファイルもあります。
Frameworkを外部から利用するための変数ではなく、単にFramework内でクラスを継承しているだけの変数なので、気分的にはあまり良いものではありません。
今後、うまい方法が見つかれば、報告したいと思います。
ロゴスウェア
最新記事 by ロゴスウェア (全て見る)
- Amazon Linux(EC2)と PHPSTORM で Xdebug を行う - 2018年9月26日
- やらないことの合意 - 2018年6月27日
- 卒園アルバムとプロジェクトマネジメント - 2018年3月30日
Comments are closed.