[Objective-c]インスタンス変数の書き方(第3回 クラスを継承する)


[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内でクラスを継承しているだけの変数なので、気分的にはあまり良いものではありません。
今後、うまい方法が見つかれば、報告したいと思います。

The following two tabs change content below.

谷中

システム開発チームと検証チームのマネージャー。 「疎結合 小さなクラス 分業制」 を裏スローガンとし、これが実現できてこそ、幸せな開発者人生を過ごせるという確信のもと、上流から設計まで口を挟んだり挟まなかったりしています。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>