約 5,571,726 件
https://w.atwiki.jp/index-index/pages/2507.html
【種別】 人名 【初出】 ヘヴィーオブジェクト 名前は巨人達の影にて判明 【解説】 ベイビーマグナムの整備班の班長。通称『ばあさん』。 出身は日本だが、娘夫婦が『資本企業』に殺されそうになったため一緒に『正統王国』へ亡命してきた。 オブジェクトの整備に関してはかなりの腕前があり、ミリンダからも信頼されている。
https://w.atwiki.jp/index-index/pages/2542.html
【種別】 食糧 【元ネタ】 Wikipedia-レーション 【初出】 ヘヴィーオブジェクト 【解説】 軍隊において、軍事行動中に各兵員に配給される食糧。 『正統王国』では食べ物によって兵士のテンションが変わらないように、あえて味のしないように作られている。 『情報同盟』のレーションには様々な種類の味覚刺激用粉末がついてくるらしい。 『資本企業』の物はステーキのような味がするとか。
https://w.atwiki.jp/kattsu/pages/33.html
オブジェクト指向 オブジェクト指向を学ぶは場合、必ず2冊以上を読むのをオススメします。 異なる視点のものを学び多角的に理解する必要があります。 オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識― 最も有名なオブジェクト指向関係の本のひとつ。 有名なシリーズですが、Javaメインの説明なのが難ですが、 サンプルが多くわかりやすいと思います。 いちばんやさしい オブジェクト指向の本 (技評SE新書 007) オブジェクト指向関係の本としては可もなく不可もなくというところ。 図解入門よくわかる最新オブジェクト指向の基本と仕組み 増補改訂版 (How‐nual図解入門―Visual guide book) 少しごちゃごちゃしていますが大切なところは抑えてあり、 ゆっくり読むにはいい本だと思います
https://w.atwiki.jp/index-index/pages/2527.html
【種別】 地域 【初出】 ヘヴィーオブジェクト 【解説】 戦争の危険のない地域のこと。 パリなどが該当。
https://w.atwiki.jp/atachi/pages/21.html
クラスのインスタンス作成 [#y39f3ee2] ポリモーフィズムなインスタンスの変数 [#kaf991cd] クラスを分割で定義できるパーシャルクラス [#e6c05c9a] ポリモーフィズム [#fefcbcc0] 静的な型情報と動的な型情報を取得 [#t2f150f9] アップキャストとダウンキャスト [#rc05e547] asによる安全なダウンキャスト [#uc029305] isによる変数の型チェック [#he61952e] ポリモーフィズムなメソッドの呼び出し [#qbe1cbe8] インターフェース [#lf5a74a6] クラスのインスタンス作成 クラスはnew演算子を使ってインスタンス化する。 MyClass inst = new MyClass(); MyClass inst2 = new MyClass(1); // 引数指定 Point p = new Point{ X=0, Y=0}; // オブジェクト初期化子 オブジェクト初期化子でクラスをインスタンス化する方法では、デフォルトコンストラクタが呼び出される。 デフォルトコンストラクタが実装されていないクラスではオブジェクト初期化子によるインスタンス化はできない。 ポリモーフィズムなインスタンスの変数 基底クラスの変数は派生クラスのインスタンスを格納できる。 class Parent { } class Child Parent { } void main() { Parent p = new Child(); // Parent型の変数にChildクラスのインスタンスを代入することができる。 } クラスを分割で定義できるパーシャルクラス これまではクラスの定義は必ず「class クラス名 { クラス定義 }」という形でコーディングしなければならなかったが、partialキーワードを使用するとパーシャルクラスと呼ばれる分割定義可能なクラスを定義できます。 パーシャルクラスは次のように同一ファイルに複数のクラス定義文を記述することもできますし、複数のファイルをまたいでクラス定義文を記述することもできます。 partial class MyTest { public int num; } partial class MyTest { public int num2; } // ↓ 以下のクラスを定義したことと同じ class MyTest { public int num; public int num2; } 元々パーシャルクラスでないクラスにpartialキーワードをつけてクラスの定義を行うことはできない。 パーシャルクラスの利点は、ツールやマクロなどによって生成されたコードを使用する場合にあります。 通常これらのコードは不用意に編集すべきではないため別ファイルとして参照し、プログラマがコーディングを行うファイルと分けたいような場合に有用です。 ポリモーフィズム 静的な型情報と動的な型情報を取得 基底クラスの型は派生クラスのインスタンスを格納できる。(アップキャスト) class Parent { } class Child Parent { } // Parent型の変数にChildのインスタンスを設定できる Parent p = new Child(); // アップキャスト 上記のコード内にある変数pについて、静的な型情報を取得したい場合にはtypeofキーワードを使用し、動的な型情報を取得したい場合は「p.GetType()」を使用します。 静的な型情報というのは、この場合Parentクラスに関する情報を指します。 動的な型情報は、この場合Childクラスの情報を指します。 アップキャストとダウンキャスト 基底クラスの変数に派生クラスのインスタンスを代入することをアップキャストと呼ぶ。 アップキャストでは次のように、キャスト先を明示しない。 class Parent { } class Child Parent { } Parent p = new Child(); // アップキャスト その逆を行うことをダウンキャストと呼ぶ。 上記のコード内にある変数pの実態はChildクラスなので、次のようにChild型変数にダウンキャストできる。 Parent p = new Child(); Child c = p as Child; // ダウンキャスト Child c2 = (Child)p; // C/C++時代の伝統的なダウンキャストの記述 asによる安全なダウンキャスト asキーワードを使用してダウンキャストを行うと、ダウンキャストに失敗した場合にnullを返すため、事前に安全なキャストであるかチェックする手間が省略できます。 C#では 専らasによるダウンキャストを使うべき です。 Child c = p as Child; if(c == null ) { // キャスト失敗時の処理 } C/C++やJavaで採用されている伝統的なキャストもC#ではサポートされていますが、使うべきではありません。 伝統的なキャストでは次のようなデメリットがあります。 一時変数を宣言する必要 キャスト例外の処理が必要 Base b = new Parent(); Parent p; try{ p = (Parent)b; if( p != null ) { // アップキャスト成功時の処理 }else{ // キャスト失敗時の処理 } }catch( ... ) { // キャスト失敗の例外処理 } キャスト例外を捕捉するためパフォーマンスにも影響してしまう。 isによる変数の型チェック isキーワードを使用すると変数に格納されたインスタンスの型を検証できる。 型が一致する場合は正を返し、一致しない場合には負を返す。 if( p is Child ) { Child c = (Child)p; // pの実態はChildであることがわかっているので、安全にダウンキャスト可能。 } ポリモーフィズムなメソッドの呼び出し アップキャストによって基底クラスの変数からメソッドを呼び出す際に派生クラスで上書きされたメソッドである場合、メソッドの上書き方法によって呼び出される処理が異なります。 // hello()がnewによる上書きの場合 Parent p = new Child(); p.hello(); // Parent.hello()が実行 Child c = p; c.hello(); // Child.hello()が実行(!) // hello()がオーバーライドによる上書きの場合 Parent p = new Child(); p.hello(); // Child.hello()が実行(C++やJavaと同じ) Child c = p; c.hello(); // Child.hello()が実行 C++やJavaではメソッドの上書きにはオーバーライドしかないため後者のような処理になる。 C#では変数には静的な型と動的な型の2種類の解釈があり、原則的に静的な型として評価します。 newによる上書きは静的なクラス情報を書き換えるため、静的な型として解釈した場合にParent.hello()を呼び出してしまう。 インターフェース メソッドの形だけを宣言する点では抽象メソッドと似ていますが、インターフェースと抽象メソッドを定義した抽象クラスとは決定的に異なる点がある。 インターフェースは、すべてのメソッドがpublic インターフェースは、複数インプリメントが可能 interface IHandler { void run(); } オブジェクト指向をしっかりと理解していなければクラスの継承とインターフェースの違いについて理解しづらい。 たとえば次のような実態を扱うためのクラスを用意する。 abstract public Person { protected string name; protected int age; public Person(string name,int age) { this.name = name; this.age = age; } abstract public void say(); } public Sato Person { public Sato() Person("佐藤",18) { } public void say() { System.Write("ぼくの名前は" + name + "です"); } } public Tanaka Person { public Sato() Person("田中",21) { } public void say() { System.Write("私の名前は" + name + "です"); } } public SpeakingRobot Person { // Personはおかしい。 public SpeakingRobot() Person("SR-1型",1) { } public void say() { System.Write("ワタシノナマエハ" + name + "デス"); } } SatoやTanakaはPersonであるため、Personを基底クラスに持つということはオブジェクト指向てきには正しいですが、 SpeakingRobotはPersonであるというには無理があり、オブジェクト指向的には間違っていると解釈できる。 正しくSpeakingRobotを実装するならば次のようになる。 // ロボットに年齢はないので、Personの時にあったageは削除した。 public SpeakingRobot { protected string name; public SpeakingRobot(){ this.name = "SR-1型"; } public void say() { System.Write("ワタシノナマエハ" + name + "デス"); } } ただし、SpeakingRobotはしゃべるロボットなのでsay()は実装した。 これらのクラスをインスタンス化して使用する際に「しゃべるオブジェクト」だけを集めてしゃべらせたい場合、SatoとTanakaはPersonを継承しているためPerson型の変数を使ってポリモーフィズムにsay()を呼び出せる。 Person[] persons = new Person[] { new Sato(), new Tanaka()}; foreach(Person p in persons) { p.say(); } // SpeakingRobotもしゃべることができるが、Person型の変数に代入することは出来ない。 そこでしゃべる(say()を実装した)機能を実装したインスタンスをまとめたい場合にインターフェースを利用できる。 interface ISay{ void say(); } abstract public Person ISay{ protected string name; protected int age; public Person(string name,int age) { this.name = name; this.age = age; } } public Sato Person { public Sato() Person("佐藤",18) { } public void say() { System.Write("ぼくの名前は" + name + "です"); } } public Tanaka Person { public Sato() Person("田中",21) { } public void say() { System.Write("私の名前は" + name + "です"); } } public SpeakingRobot ISay { public SpeakingRobot() Person("SR-1型",1) { } public void say() { System.Write("ワタシノナマエハ" + name + "デス"); } } void main() { ISay[] sayObjects = new ISay[] { new Sato(), new Tanaka(), new SpeakingRoot()}; foreach(ISay say sayObjects) { say.say(); } }
https://w.atwiki.jp/w_nishiki/pages/1.html
かぐらプロジェクトへようこそ ここは、創作サークル「かぐらプロジェクト」のウィキです。 ■ メニュー 管理人「にしき」の小説 ■ ドラゴンライド 竜に乗って空を飛びたい、そんな思いを込めて書き始めたファンタジー小説です。 ドラゴンライド1 ドラゴンライド2 ドラゴンライド3 ドラゴンライド4
https://w.atwiki.jp/mopsprogramming/pages/115.html
ここまで何回か述べてきたように、Mopsでの動的オブジェクト生成はハンドルによって行われ、ハンドルは、場合によっては、かえって不便なことがあります。そこで、ポインタを用いたヒープオブジェクトのリストのクラスを自分で作ってみようというわけです。GUIオブジェクト、主としてマルチウィンドウの登録用に使えると思います。 前提の話ですが、MopsにはPtrListというクラスがあります。これはその名に期待される通り、ポインタのリストで、事後的に要素を自由に追加削除できます。ではそのまま使えばいいかというと、残念ながらそうはいきません。実は、このリストはヒープオブジェクトを前提としたものではありません。むしろ、静的なオブジェクトのベースアドレスをリストにして、一括して扱う目的のものといえます。それでも、ポインタのリストを操作するという機構を備えているので、これを継承して、サブクラスで動的オブジェクトをあつかうメソッドを追加する方法が考えられます。これがもっとも合理的なやり方でしょう。ここでは、その方法を説明します。一応、実際にサンプルを書いてみました。最適なやり方というつもりはありませんが、問題なく動くと思います。いくつか、おまけもつけましたが、シリアライズ(オブジェクトをファイルなどに書き出して永続化する方法)の機能はつけませんでした。サンプルコードはここからダウンロードできます。この中身について、主要な部分をここで説明しようと思います。全部は引用しませんので、全貌についてはサンプルをダウンロードして合わせてご参照ください。コードにあまりコメントはありません。すみません。ブラウザで見たい方はこちら。かんたんでしょ(^_^) PtrListクラスは、Ptrクラスと(PHLIST)クラスを、この順に二重継承しています。後者は、おそらくPointerとHandleのリスト、という意味で、それ用にカスタマイズされたSEQUENCEクラスのサブクラスです。このPtrListクラスを継承して、ObjPtrListというクラス名にしました。 メッセージは、できるだけHandleListクラスと互換性があるようにすることを目指します。 最初の難関は新しいオブジェクトを生成するところです。NewObj メソッドの定義をご覧下さい。 m newobj { ^CLASS -- } nilp add super ^CLASS CL LEN Obj_hdr_Length + new self 0 get self ! ^CLASS obj self make_obj ;m 引数であるClassXTはnamed parameterに格納しておきます。インデックス付きオブジェクトを追加するときの懸念が不要になります。PtrListに新しい項目を追加するメッセージは、ポインタを引数にしてAdd です。そこで、とりあえず、nilPをAdd して、要素を追加しておきます。 それから、オブジェクトのサイズ+オブジェクトのヘッダデータ長(obj_hdr_length)分の大きさのヒープ領域を獲得して、そのポインタを格納します。オブジェクトのサイズは、ワード"CL LEN"に(オプショナルにインデックスオブジェクトの要素数と)ClassXTを与えて得られます。ヒープ領域の確保にはPtrクラスのNew メソッドを使います。ヘッダデータを追加する前に、最初の4バイト分をクリアしておく必要があります。そして、オブジェクトの(インデックスオブジェクトには要素数と)classXT、および、実際にオブジェクトデータが始まる部分のアドレス(ヒープ領域のはじめからヘッダの長さの分取り除いたところ)を引数にして,ワードmake_objを呼びます。これで、確保したヒープ領域にオブジェクトのヘッダデータが記録されるとともに、オブジェクトが初期化されます。ヒープオブジェクトを生成するにはこのようにすればよいことは、ObjHandleクラスのメソッド定義を参照すれば明らかです。 オブジェクトのベースアドレスは、いつも、ヒープ領域の頭からヘッダデータの分だけ後方にずれたところにあります。ちなみに、PowerMopsでのヘッダデータの長さは、現時点では12バイトです。ですから、オブジェクトのベースアドレスを採るときは、いつもポインタ値に12足した値を返すことになります。ですから、上でも利用されているObj メソッドは次のように定義されています。 m obj inline{ ^base @ obj_hdr_length + } ;m このメソッドは頻繁に呼び出されるであろうという想定の下、インライン定義をしています。呼び出しをコンパイルするのでなく、呼び出し部分にこのコード内容が直接書き込まれる、という意味らしいです。あまり効果はないかもしれません。 上のobj メソッドでは、このリストクラスでは、^BASEもSELFの、第一次的にはリスト中の現行(current)要素のオブジェクトベースアドレスを意味しているということを利用しています。つまり、現行要素が変わるたびに、これらが意味するもの(値も)変わるわけです。ここでは^baseは現行要素をなすポインタオブジェクトのベースアドレスですから、そこには、ヒープ領域を指し示すポインタ、つまりその頭のメモリーアドレスが格納されているわけです。そこから、ヘッダデータ分をとばしたところがこのヒープオブジェクトのベースアドレス、というわけです。 もうひとつ、説明しておきたいのは、First? メソッドとNext? メソッドをオーバーライドしている点です。これはBEGIN each ... WHILE REPEATループの挙動を変えるのが目的です。 m First? ( -- ^obj T | F ) First? super NIF false EXIT THEN obj_hdr_length + true ;m m next? ( -- ^obj T | F ) next? super NIF false EXIT THEN obj_hdr_length + true ;m もう少し特定すれば、First? とNext は、(PHLIST)クラスのeach メソッドの定義の中で、Late Bindで用いられているのです。each は、はじめはFirst? を送り、次からはリストが尽きるまでNext? を送ります。名前からわかる通り、First はリストの最初の要素(0番)をセレクトし、Next? は、次の要素をセレクトしていくわけです。これらのメソッドは、また、単にセレクトするだけでなく、対応する要素が存在しなかった場合にはFalseを返し、存在する場合には、"その要素に関わる値"とTrueの二つの値を返します。この真偽値をWHILEが受けてループを制御するわけです。 (PHLIST)クラスでは、"要素に関わる値"としては、格納されているポインタが返されるようになっています。PtrListクラスでもオーバーライドはなく、そのまま継承されています。ところが、そうなると、いま作ろうとしているObjPtrListクラスからみると、この値はヒープ領域そのもののポインタになってしまい、オブジェクトのアドレスにはなりません。いまリスト要素として重要なのは、そこに格納されているオブジェクトの方でしょう。そういうわけで、オブジェクトのベースアドレスが取れるように変形したわけです。 上の変形は、デバッグ用のメソッドであるPRINTALL とDUMPALL の定義に役立っています。これらは、PtrListクラスにはなく、HandleListクラスを参考に定義したものです。 m printAll nil? theList IF ." (not open) " EXIT THEN get pos BEGIN each self WHILE print ** cr REPEAT (SEL) self ;m m dumpAll nil? theList IF ." (not open) " EXIT THEN dump super cr ." current " current self dup . cr ." elements " cr BEGIN each self WHILE dump ** cr REPEAT select self ;m HandleListクラスは、" Mops source PPC source pStruct"というファイルに(もちろん" "はフォルダ階層を意味していて、Mopsの最上位フォルダの中から書いてあります。この期に及んで念のため(^^;;)。)あります。ご参照ください。 関連項目: 動的オブジェクトリストクラスの自作2 動的オブジェクトのリスト トップページへ 目次
https://w.atwiki.jp/fcjack/pages/91.html
植物を含めキャラクターやオブジェクトの描画距離を伸ばします。 system.cfgに以下の項目を追記してください。 例 e_obj_view_dist_ratio = "100" 初期値は55で、大きいほど描画距離が伸びます。 当然ながら負荷が大きくなるのでバランスを考えて調節してください。 参考画像 遠くまで木がモサモサ、ここからでも浜辺のキャラクターが見えます plugin_back is not found. please feed back @wiki.
https://w.atwiki.jp/index-index/pages/2566.html
【種別】 地域 【初出】 ヘヴィーオブジェクト 【解説】 ノルマンディー方面にある、『正統王国』の『安全国』に指定されている中でも最も力のある近代国家。
https://w.atwiki.jp/mopsprogramming/pages/116.html
もう一つ動的オブジェクトのリストをつくってみましょう。動的オブジェクトのデータを格納するためのヒープを確保するのに標準Cライブラリ関数を使ってみようというのが目的です。Mac OS Xでは標準だというので、様子を見るのも悪くないでしょう。もちろん、Mac OS 9.x以前でも使えます。ソースコードのダウンロードはこちら。ブラウザで見たい方はこちら。 メモリーを確保する関数はmalloc()で、これを解放する関数はfree()です。C言語プログラミングではおなじみの関数です。これらは、StdCLibという名前のPEFシェアードライブラリから呼び出せるようになっています。そこで、冒頭でこれらを宣言します。 Library StdCLib LibCall malloc { size -- addr } LibCall free { addr -- } 一応、単独の動的オブジェクトの生成にも使えるようなポインタクラスをつくってみましょう。上位クラスはLongWordとします。4バイト幅のデータクラスのおおもとになるクラスです。ここで定義するのもポインタクラスですから、Mopsでのポインタの規約に合わせて、空っぽのときにはnilPを格納しておくようにします。ClassInit メソッドとFreeHeap メソッドでそれを行います。もちろん、FreeHeap メソッドでは、free()でヒープも解放します。 オブジェクトを生成する際には、クラスの長さ+オブジェクトヘッダの長さ分のメモリーを確保して、make_objでオブジェクトデータを流し込みます。ObjPtrListクラスで各項目に対してしたのことと同じです。 Release とReleaseObj は同じ内容にして、まずオブジェクトにそのクラスなりのRelease を送ってからFreeHeap します。 m ReleaseObj ( -- ) nil? Self ?EXIT\ もう解放されていたら何もしない obj self Release **\ まず動的オブジェクトにRelease FreeHeap Self\ オブジェクトに割当てられていたヒープメモリ全体を解放 ;m ここで定義されたDyObjPtrクラスのインスタンスは、ポインタ版 ObjHandleとして使うことができると思います。デバッグ用のメソッドとか、シリアライズ関係のメソッドはありませんが、クラスXTを引数にしてNewObj メッセージを送れば、動的オブジェクトが生成されますし、Obj メッセージでオブジェクトのベースアドレスを取る方法で、メソッドをバインドすることができます。 これをリスト化するには、このDyObjPtrクラスを第一位に、(PHLIST)クラスを第二位にして二重継承した新しいクラスをつくれば、だいたいおしまいです。ただ、この継承の順番は重要です。インデックス付きのクラスをつくるには、大抵、項目となるオブジェクトのクラスを第一順位、そのタイプのリストのためのジェネリッククラスを第二順位に多重継承するようになっています。 もちろん、リスト固有のメソッドも定義しておかなければなりません。ただ、これは、ObjPtrListクラスをつくったときの話で尽きているので、合わせて参照してください。 関連項目: 動的オブジェクトリストクラスの自作1 トップページへ 目次へ