Hori,Masaki
masak****@users*****
2002年 10月 31日 (木) 23:56:44 JST
はじめまして、堀です。
よろしくお願いします。
勝手に実装案を考えてみました。
あくまで案ですので却下して頂いて結構です。
実装案
拡張性を高めるため本体のクラスはPlug-inから隠ぺいする。
本体はsingletonとする。
本体は所定のプロトコルを採用する。
本体は各Plug-inの橋渡し役に徹する。全Plug-inを総括的にラップしたものと考えても良い。
本体はNSApplicationをカテゴライズし、+(id)sharedMainController;を実装する。これはあらゆるところから本体
にアクセス可能にするため。
上記実装案による実装例(骨組みだけです)
----unnamedMailInterface.h---
@protocol POPEngine
// any
@end
@protocol POPController
-(void)setPOPEngine:(id <POPEngine>)engine;
// and any.
@end
@protocol MainController <POPController,SMTPController,anyProtocol>
// any
@end
@interface NSApplication (UnnamedMailInterface)
+(id)sharedMainController;
@end
----MainController.h----
// このファイルの外部参照を禁止する。
// 独立性を上げるためMainControllerは可能な限り個別のクラスに実際の処理を任せる。
@interface MainController <MainController> : NSObject
{
id <POPController> POPController;
id <SMTPController> SMTPController;
// and any.
}
@end
----MainController.m----
static id _instance = nil;
@implementation MainController
+(id)sharedInstance
{
if(_instance) return _instance;
return [[self alloc] init];
}
-(id)_privateInit
{
if(!_instance) {
_instance = [super init];
if(_instance) {
// initialize
}
} else {
[self release];
}
return _instance;
}
-(id)init
{
return [self _privateInit];
}
-(id)retain
{
return _instance;
}
-(oneway void)release{}
-(unsigned)retainCount
{
return UINT_MAX;
}
@end
@implementation NSApplication (UnnamedMailInterface)
+(id)sharedMainController
{
return [MainController sharedInstance];
}
@end
------SomePlugin.m-------
-(id)init
{
self = [super init];
if(self) {
// Plug-inはコントローラーのクラスを知らない。
[self setMainController:[NSApplication sharedMainController]];
// initialize
}
return self;
}
#間違って管理用アドレスに投げてしまいました。
#ヘッダからコピペする時コピーする場所を間違えました。すみません。