もくじ へ このページの記事は、前のページの「お行儀良く味見」が理解されていることを前提として書かれています。
「Model部」のコーディング
MyModelObject.h ファイルでは、もはやメソッドしか定義されず、インスタンス変数は隠蔽される。
/* MyModelObject */ #import |
#import "MyModelObject.h"
@interface MyModelObjectLocal : MyModelObject
{
double sumData;
}
@end
@implementation MyModelObjectLocal
- (id)initWith:(double)sender
{
sumData = sender; // 初期値のセット
return self;
}
- (void)addData:(double)sender
{
sumData += sender;
}
- (double)lookData
{
return sumData;
}
@end
@implementation MyModelObject
- (id)initWith:(double)sender
{
[ self autorelease ];
return [ [ MyModelObjectLocal alloc ] initWith: sender ];
}
+ (id)modelWith:(double)sender
{
return [ [ [ MyModelObjectLocal alloc ] initWith: sender ] autorelease ];
}
- (void)addData:(double)sender { }
- (double)lookData { return 0.0; }
@end
|
anObj = [ [ ClassName alloc ] init ];
|
anObj = [ ClassName alloc ];
[ anObj init ];
|
「Model部」のコーディング(サブクラス対応)
"自分" と騙って、呼び出し側に実はローカルなサブクラスを使わせる偽装工作は、もちろん個人で作るちょっとしたプログラムでは何の問題も出ないが、他人が知らずにサブクラスを作るような場合には問題が出る。もしも自分に新しいメソッドが追加された場合には、それはローカルなサブクラスに追加されたメソッドでは無いので、それがオーバーライド(上書き)を期待したものでも無視されてしまうし、新しい名前のメソッドなら存在しないメソッドとして実行時エラーになってしまう。 あくまでも外部に対しては、影武者?なローカルサブクラスを持っていることをオクビにも見せずに、シラを切り通したいならば、自分で生成したローカルサブクラスのインスタンスへのポインタを記憶しておくために、少々工夫が必要となる。また、破棄の責任も果たさなければならない。
以下がこのようなことを考慮した MyModelObject.m ファイルである。
#import "MyModelObject.h"
@interface MyModelObjectLocal : MyModelObject
{
double sumData;
}
@end
@implementation MyModelObjectLocal
- (id)initWith:(double)sender
{
sumData = sender; // 初期値のセット
return self;
}
- (void)addData:(double)sender
{
sumData += sender;
}
- (double)lookData
{
return sumData;
}
@end
@implementation MyModelObject
- (MyModelObjectLocal *)memo: (MyModelObjectLocal *)sender
{
static MyModelObjectLocal *x = nil;
if( x == nil )
x = sender;
return x;
}
- (id)initWith:(double)sender
{
[ self memo: [ [ MyModelObjectLocal alloc ] initWith: sender ] ];
return self;
}
+ (id)modelWith:(double)sender
{
return [ [ [ self alloc ] initWith: sender ] autorelease ];
}
- (void)addData:(double)sender
{
[ [ self memo: nil ] addData: sender ];
}
- (double)lookData
{
return [ [ self memo: nil ] lookData ];
}
- (void)dealloc
{
[ [ self memo: nil ] release ];
[ super dealloc ];
}
@end
|
2002.6.6