[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.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

Comments are closed.