Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++から見たObjective-C - オーバーライド

タグ: C++ Objective-C

最近Objective-Cを触り始めたので、最も付き合いの長いC++と比べながら色々見ていってみる。
比べるといっても、C++にObjective-Cのような実行時解決能力を求める気はさらさらないので、解決のタイミングが実行時かコンパイル時かはここでは無視。
基本的には、Objective-Cは実行時解決、C++側はコンパイル時解決するものとして話を進める。

また、これは純粋な言語仕様の比較ではなく、あくまでも「『これを書いている時点での私』が使う上での比較」である。
単に「Objective-C」と書いているが厳密はこれは「Objective-C + Cocoaフレームワーク」であり、同様にC++も素のC++ではなく「C++ + Boost」である。

メソッドのオーバーライド

メソッドをオーバーライド/実装する時、わざわざインタフェース部で宣言しなくて良いのは嬉しい。

@protocol Foo
- (void)append:(int)n;
@end

@interface Bar : NSObject <Foo>
{
@private
	NSMutableArray* array;
}
// -(id)init;
// -(void)dealloc;
// -(void)append:(int)n などの宣言は不要
@end

@implementation Bar
- (id)init
{
	if(self = [super init])
	{
		array = [[NSMutableArray alloc] init];
	}
	
	return self;
}
- (void)dealloc
{
	[array release];
	[super dealloc];
}
- (void)append:(int)n
{
	[array addObject:[NSNumber numberWithInt:n]];
}
@end

C++はこれが地味に面倒。
仮想関数なら書かなくても良さそうなものだが、非仮想関数と書式が変わるのもそれはそれで鬱陶しいから仕方ない。

class Foo
{
public:
	virtual ~Foo() {}
	virtual void append(int n) = 0;
};

class Bar : public Foo
{
public:
	virtual void append(int n); // 1つだけならさして苦でもないが……
	
private:
	std::vector<int> array;
};

void Bar::append(int n)
{
	array.push_back(n);
}

この例だと、コンストラクタやデストラクタの分だけC++の方が楽に映るかな……

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/114-b72abb06
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。