はてなキーワード: スーパークラスとは
2条1号が変わる
↓
トリッキーな改正で、「別表第一」には様々な麻薬の成分がリストアップされているんだけど
大麻をこのリストに加えればいいのに、わざわざ2条1号の文言修正している。
なぜかと言えばできない、このリストに加えると大麻を麻薬扱いしなきゃならない
意味わかんないよね
いやいやいや、単語の定義で明瞭に麻薬と指定しているではないか
これね、麻薬に指定してないの、指定するなら別表1に加えなきゃならない。
法律の最初には単語の定義を示すものが多いんだけど、これはエイリアス
もしくはC言語の#defineのようなもの、動作や作用を定義するものではない
つまりあくまでも麻薬取締法の条文中の麻薬という単語のエイリアスを定義しているにすぎない
例えば「麻薬製剤業者」は法律中に28箇所出てくるが、ここで全て
「厚生労働大臣の免許を受けて、麻薬を製剤すること(麻薬に化学的変化を加えないで他の麻薬にすることをいう。ただし、調剤を除く。以下同じ。)、又は麻薬を小分けすること(他人から譲り受けた麻薬を分割して容器に収めることをいう。以下同じ。)を業とする者」
例えば、道路法と道路交通法ではそれぞれの法律の中において「道路」の定義は異なる。
道路交通法は道路法のスーパークラスを継承しつつオーバーライドしている。
こういうことはよくある。
(ところがこれがややこしくて、道路法では道路そのものを定義をしている、道路交通法では道路のエイリアスにすぎない)
ともかく法律は1条で立法目的や趣旨を書いて、2条で法律中の単語のエイリアスを定義するのが作法。
ともかく、ところが、「麻薬 別表第一に掲げる物及び大麻をいう。」と書けばあたかも
ちゃうちゃう、麻薬の指定をしてるんじゃない、麻薬という単語のエイリアス定義にすぎない。
これを
と定義しても法律中の論理構造は崩れない。ただのエイリアスだから。
「麻薬及び向精神薬の濫用による保健衛生上の危害を防止し、もつて公共の福祉の増進を図る」
大麻によって「保健衛生上の危害」が生じていることを立法事実として示さなければならない。
ところがね、これが無いのよ。
我が国に大麻による健康被害、保健衛生上の危害が生じているという立証がされてない。
ともかく、とはいえかなりこじつけ矛盾をはらんだずさんな改正で、今後のこの定義周辺を突いた違憲訴訟が楽しみだが、どうせ立法裁量内で括られるんだろうけどw
javascriptでスーパークラスのメソッドを簡単に呼び出したかった。それだけだった。
var Class = inherit(SuperClass, {hoge: ...});
作ったクラスはprototypeに、第二引数のオブジェクトがコピーされたスーパークラスのインスタンスを持つ。
第一引数がnullだと、スーパークラスにObjectを用いる。つまり、
var Class = inherit(null, {hoge: ...});
は
var Class = inherit(Object, {hoge: ...});
と同等となる。
また、第一引数が"prototype"をメンバに持たない普通のオブジェクト、つまり、
var Class = inherit({hoge: ...});
だと
var Class = inherit(Object, {hoge: ...});
と同等となる。
var obj = new Class({hoge: ...});
でインスタンスを作ると、引数のオブジェクトのコピーを持つオブジェクトとなる。
また、メソッド"initialize"が自動的に実行される。
ただし、コンストラクタに引数を渡さなかった場合は、initializeは実行されない。
this.superapply(arguments);
としてスーパークラスのメソッドを呼べる。第一引数は呼び出すメソッドの引数の配列とする。
このとき、呼び出し側のメソッドはコンストラクタやinheritでオーバーライドしたメソッドでなくてはならない。これは呼び出し側のメソッド名を記録する必要があるためである。
そうでない場合は第二引数にメソッド名を渡す必要がある。
var obj = new Class({}); obj.foo = function(){ this.superapply(arguments); // X this.superapply(arguments, "foo"); // O };
<html><head> <script type="text/javascript"> function inherit(superclass, override) { if (!superclass) superclass = Object; if (! "prototype" in superclass) { override = superclass; superclass = Object; } var that; var func; function superapply(arg, name) { var prev = {that: that, func: func}; try { var my = this.superapply; if (!arg) arg = []; if (!name) name = arguments.callee.caller.caller.methodName; if (that && func && (!name || name == func.methodName)) { that = that.superapply.obj; name = func.methodName; } else if (name) { that = my.obj; func = arguments.callee.caller.caller; func.methodName = name; } else { throw new Error("methodName is null"); } var result; if (func === that[name]) { result = this.superapply(arg, name); } else { func = that[name]; func.methodName = name; result = func.apply(this, arg); } } finally { that = prev.that; func = prev.func; } return result; }; var prototype = new superclass(); prototype.superapply = function(){superapply.apply(this, arguments)}; prototype.superapply.obj = superclass.prototype; if (override) for (var i in override) { prototype[i] = override[i]; if (typeof override[i] == "function") prototype[i].methodName = i; } var subclass = function(obj) { this.superapply = function(){superapply.apply(this, arguments)}; this.superapply.obj = prototype; if (obj) { for (var i in obj) { this[i] = obj[i]; if (typeof obj[i] == "function") this[i].methodName = i; } this.initialize(); } }; subclass.prototype = prototype; subclass.prototype.constructor = subclass; return subclass; } var C1 = inherit(Object, { fn: "C1", initialize: function(){ alert("C1.initialize"); this.second(this.fn); }, second: function(a){ alert("C1.second: "+a); } }); var C2 = inherit(C1, { fn: "C2", initialize: function(){ alert("C2.initialize"); this.superapply(); // }, //second: // function(a){ // alert("C2.second: "+a); // this.superapply([a]); } }); var C3 = new C2({ fn: "C3", //initialize: // function(){ // alert("C3.initialize"); // this.superapply(); // }, second: function(a){ alert("C3.second: "+a); this.superapply([a]); } }); </script> </head><body> </body><html>
methodNameなんとかならんもんか。
やっぱりprototype.jsのClass.create?
使った事無いけどスーパークラスのメソッド呼び出しできるんだっけ?
http://iandeth.dyndns.org/mt/ian/archives/000664.html
とか参考に自分で書いたら段々でかくなって、4行が今57行w
やっぱ言語のサポートないと辛いわ。こんなに大変だと思わなかった。
って事で「javascriptの継承方法の決め手」なーい?と聞いてみる。
欲しいのは、多重継承が可能で、オーバーライドした子クラスのメソッドから、簡単にオーバーライドされてる親クラスのメソッド呼びたい。ただし、thisは子クラスのオブジェクトのままで、しかも何段でもチェーンをたどれるように。
それとも、あきらめて、クラス名付きで直接親メソッド呼んだ方が良いのかな。やっぱり。
ま。とりあえずシュミグラマだから趣味に走ってみるけれども。
趣味グラマーのおいらに言わせりゃ、オブジェクト指向だなんだとかっこいい言葉を使っちゃいるけど、現状の実態は構造化のなれの果てのような気がする。
というかなんか酷い。こんな現状ならオブジェクト指向なんかない方がいい。
結局使われ方だってメンバっつうか、メソッドレベルのクラス化だし、
なんていうのかな・・・
たとえるのなら、
windowsのフォルダの階層を無駄に山のようにつくって、迷路のようにした挙句、
プロはこんな風にあらかじめ決まったフォルダ構造を導入すると何がどこにあるかわかるんだ!
とかいっちゃいながら、結局なにをどこにしまったかわらなくなって、案内用のドキュメントをつくったりしてる、
そんな滑稽な姿がおもいうかぶんだ。
いや、100人月いくぐらいのサイズのものだったらわかるよ?
そうやった方が効率的だし、再利用効くよね。
でも、ファイル数個格納するのにこのフォルダ数は意味ないだろ?的な、
大変だ!このままじゃ利用しにくいからデスクトップにショートカットつくろう!
これがスーパークラスだー!
とか、なんつうか本末転倒。
オブジェクト指向もほどほどにねー。