3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flash Advent Calendar 16日目 - 修飾子対応 -

Posted at

Flashのクラスは通常のプログラミングと同様に修飾子が存在します。

修飾子 アクセス可能範囲
public どこからでもアクセス可能
private 同じクラス内からのみアクセス可能
protected 同じクラス、及び子クラス(継承クラス)からアクセス可能
internal 同じパッケージ内からのみアクセス可能

でも、JavaScriptにはpublicしか存在しない。。。

どうやって制御したものか・・・

swf2jsのクラスにはFlashが定義した関数とそれを実現する為の関数が存在してます。
packageクラスの変数や関数を追加すると混沌としたクラスになってしまうので、まずは別空間を準備しようと思います。

ActionScript3.0仕様書

仕様書を見る限り、変数や関数はtraitに格納されています。
別空間として、traitを格納先として利用しようと思います。
そして、必要になったタイミングでクラスの別空間に格納して利用すれば実現できるのではないかと思いました。

別空間を準備する

各クラスが拡張されてもいいようにObjectクラスに
variables という空間を準備してMapクラスのkey-valueで管理をする。

修飾子 アクセス可能範囲
public そのままの名前を利用
private クラスにナンバリングを行い、id_名前で管理する
protected クラス===JSのクラスか、クラス instanceof JSのクラスで判定して通過すればそのままの名前で管理
internal namespaceが存在するので、namespace_名前で管理する

public

// 取得
variables.get(name);

// 配置
variables.set(name, value);

private

// 取得
if (package.id === scope.packageId) {
    variables.get(package.id +"_"+ name);
} 

// 配置
if (package.id === scope.packageId) {
    variables.set(package.id +"_"+ name, value);
} 

protected

// 取得
const package = getPackage(namespace);
if (scope instanceof package) {
    variables.get(name);
} 

// 配置
if (scope instanceof package) {
    variables.set(name, value);
} 

internal

// 取得
if (scope.namespace === trait.namespace) {
    variables.get(trait.namespace +"_"+ name);
} 

// 配置
if (scope.namespace === trait.namespace) {
    variables.set(trait.namespace +"_"+ name, value);
} 

サクッと書いたのですが、思いつくまでが凄く大変だったのですが
思いついてしまえば、とてもシンプルな構成になりました。

ただ、public以外は判定式が入るので、どうしてもオーバヘッドが発生してしまいます。
ここは今も頭を抱えてるポイントです...。
何かいい案がある方は是非、コメントいただければ嬉しいです:bow:

明日は紀平さん(@tkihira)の「知られざる globalCompositeOperation テクニック」です!!
凄く楽しみにしていたので、是非一読頂ければと思います!!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?