home link download back number special issue

HMDT - Special Issue / Sketch BP / 円弧ツールの基本部分の実装


- Modification -

円弧ツールの基本部分の実装

円弧ツールの基本的なクラスインタフェース

じゃ、円弧ツールの実装の話だ。ごりごりと、コードを書いていくぞ。

まず、円弧ツールのためのクラスの名前を決めよう。SKTArc にする。それに決めた。SKTArc は SKTGraphic を実装することにする。それが、ドローオブジェクトのルートクラスだからな。

次に、円弧ツールで、円弧を表現するために必要なインスタンス変数は何か、を考えてみよう。前の仕様の節で考察したように、円弧は領域の大きさと、どの象元に弧を描くかで、決定されるんだ。

この 2 つが決まれば、一意的に円弧を決定することができる。領域の大きさは、SKTGraphic で、NSRect 型の _bounds というインスタンス変数で管理されている。これを使おう。円弧の象元を表す変数は、円弧ツール独自のものなので、ここで定義しよう。int 型で、方向を表す定数をとるんだ。名前は _direction っていうことにする。

Sketch/DocumentModel.subproj/SKTArc.h (created by mkino)
    int 	_direction;

この変数がとる値は、前のドローオブジェクトの仕様の追加のところででてきた、方向を表す定数だ。この値ね。

Sketch/DocumentModel.subproj/SKTGraphic.h
// By mkino [start]
enum {
    NoneDirection 		= 0, 
    UpperRightDirection	= 1, 
    UpperLeftDirection	= -1, 
    LowerLeftDirection	= -2, 
    LowerRightDirection	= 2, 
};
// By mkino [end]

で、インスタンス変数があれば、それに対するアクセッサが必要になる。名前は direction と setDirection にしよう。Cocoa の流儀に従って、get*** はつけないことにした。

Sketch/DocumentModel.subproj/SKTArc.h (created by mkino)
- (void)setDirection:(int)direction;
- (int)direction;

ここまでのところをまとめると、SKTArc のインタフェースはこんな感じになる。

Sketch/DocumentModel.subproj/SKTArc.h (created by mkino)
//
// SKTArc.h
//

#import <Cocoa/Cocoa.h>
#import "SKTGraphic.h"

@interface SKTArc : SKTGraphic {
    @private
    int 	_direction;
}

- (void)setDirection:(int)direction;
- (int)direction;

@end

とりあえずは、こんなところ。


円弧ツールの基本的なメソッドの実装

上で定義したものも含めて、基本的なメソッドの実装を考えるぜ!

基本的なメソッドで、実装する必要があるものは、次の通りだ。

  • init
  • copyWithZone:

init は初期化のメソッド。インスタンス変数を初期化するんだ。copyWithZone: では、追加された _direction をコピーする。dealloc は、今回は必要ない。オブジェクトをインスタンス変数に取らないからね。


init

init の実装は以下の通り。

Sketch/DocumentModel.subproj/SKTArc.m (created by mkino)
- (id)init {
    self = [super init];
    if (self) {
        _direction = NoneDirection;
    }
    return self;
}

親クラスを呼び出して、_direction を初期化する。そんだけ。


copyWithZone:

続いて copyWithZone:_direction のコピーが加わる。

Sketch/DocumentModel.subproj/SKTArc.m (created by mkino)
- (id)copyWithZone:(NSZone *)zone {
    id newObj = [super copyWithZone:zone];
    
    [newObj setDirection:[self direction]];
    
    return newObj;
}

_direction をコピーするのに、この後で説明する directionsetDirection: メソッドを使っているんだ。


direction, setDirection:

そして _direction へのアクセッサ。directionsetDirection: だ。

Sketch/DocumentModel.subproj/SKTArc.m (created by mkino)
- (void)setDirection:(int)direction {
    _direction = direction;
}

- (int)direction {
    return _direction;
}

簡単だね!これにて終了。


- ソースコードのダウンロード -

HMDT - Download / Sketch BP


Home | Link | Download | Back Number | Speciall Issue

Sketch BP

mailto: mkino@xd5.so-net.ne.jp

HMDT