コラム / クラスうんぬん


コラム

48 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:09:51.06 ID:cUxJmRDb0
   インスタンスという概念がよく分からん

   「インスタンスとは直訳すると箪笥(たんす)の中という意味だ。
   つまり、外に出たふたの無い容器と違って開けたり閉めたりしないと
   使えないということだ。」

   「 設計図がクラスで、実際の製品がインスタンスちゅう理解で良い? 」

   「 インスタンスとは、ありていに言えば変数のこと。
   実体化したものという意味合いで、クラスが実体化したもの、つまり変数。 」 
53 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:17:09.51 ID:SZsRMxA00
   >>48
   型と変数みたいなもんだお

   var
    mybmp: TBitmap;//宣言
   begin
    mybmp:=TBitmap.Create;

   この例だとmybmpがインスタンスだお
   TBitmap.Create;はビットマップクラスのコンストラクタ(新しいの作るくん)だお
   インスタンスはポインタみたいな物だから宣言しただけだと中身が空だお(=ぬるぽ)
   だからコンストラクタくんに新しいのを作ってもらって代入するんだお 
56 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:23:56.53 ID:SZsRMxA00
   ちなみに>>53の例だとAssigned(mybmp)ってやると中身が空か入ってるかわかるお

   begin
    if Assigned(mybmp) then beep;//空だからならない
    mybmp:=TBitmap.Create;
    if Assigned(mybmp) then beep;//空じゃ無いからなる

   作っていらなくなったらFreeだお
    mybmp.Free;
   普段はこれだけど、これだとmybmpに「空です」って情報が入らないから
   後で空かどうか調べたりしたいなら
    FreeAndNil(mybmp);
   って書くといいお 
57 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:26:38.36 ID:SZsRMxA00
   >>55
   わかんなくても一応使えちゃうのがDelphiだお
   だから大丈夫だお
   たとえばボタンをフォームにペタッって貼ると
   そのたびに自動でDelphiの中の人がTButtonのインスタンスを作ってくれてるんだお 
60 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:31:58.85 ID:aylMiUqq0
   頑張って説明考えたけどちと遅かったみたいだ
   >>59
   yes

   var
       a, b: TBitmap;
   begin
       //メモリのどっかに「TBitmap」っていうのを新しく作って、その「場所」をaに代入している
       //なおCreateで新しく作ったものはFreeで消す決まりがある
       a := TBitmap.Create;
       b := a; //「場所」を移しただけなので実体はコピーされていない

       //BMP画像の幅を100に変更した。aとbがさす「場所」が一緒なので、b.Width := 100; でも一緒
       a.Width := 100;
       b.Free; //今はaとbがさす「場所」が一緒なのでこれでOK。a.Freeでもいい。

       //これはアウト。その「場所」からはもうTBitmapは消された後なので、
       //消されたところを再度消そうとすると祟りが起こる
       a.Free;
   end; 
62 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:41:42.24 ID:SZsRMxA00
   簡略化して書いてるから、ちゃんと勉強したいなら本とか買ってですお
   でも勉強しなくてもDelphiは使えるから本買わなくていいですお

   クラスとインスタンスの話のついでに継承の話し書くお
   継承ってのは何とかクラスをベースに何とかクラスを作ります(作りますた)って事だお
   たとえばビットマップ(TBitmap)は画像(TGraphic)を継承して作られてるですお
   だからビットマップは画像の機能も使えるですお
   たとえば幅(Width)とか高さ(Height)とか読み込み(LoadFromFile)とかですお

   ちなみにDelphiのクラスの全ては元をたどってくと、TObjectってのを継承して、それを継承したのを継承して
   とかになってるですお 
63 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 11:42:50.93 ID:SZsRMxA00
   var
    nanika: TObject;//宣言
   begin
    nanika:=TBitmap.Create;

   nanikaはTObjectなのでTObjectを継承したものなら何でもはいるですお
   でもこれだと何が入ってるか判らないですお

   >>62の続き

   if nanika is TBitmap then ShowMessage('TBitmapですお');

   こうやって判別するですお
   でも、幅が知りたくて
    nanika.Width
   ってやっても、TObjectに幅(Width)が無いのでエラーになっちゃうですお。困ったですお
   そういう時は

   if nanika is TBitmap then
    begin
     TBitmap(nanika).Width

   ってやると出来ますお
   ちょっと嘘も書いてるけどこんな感じですお 
68 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 12:05:04.65 ID:SZsRMxA00
   >>67
   たとえば画像には幅があるけど音には幅が無いでしょ?
   なので”全ての素”(白い紙)を基にして足していって”画像”(TGraphicとか)になった所で
   ”幅”って機能をつけてるんだお
   だから無いんだお
69 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 12:09:18.21 ID:Ezmrx1gKO
   >>67
   幅 変数は 継承先で実装されてるよ

   Tオブジェクト→Tコンポーネント→Tコントロール→Tボタン

   だったかな?
   継承は何段もされるから
   おれらが張りつけるこんぽーねんてたちは Tオブジェクトの孫の孫とか 
73 :以下、名無しにかわりましてVIPがお送りします :2006/01/31(火) 12:11:52.04 ID:SZsRMxA00
   たとえば食べ物ってクラスがあったとするお
   これには食べられる以外の機能は無いお
   なので お好み焼きだ! と思っていきなり 食べ物.ソース
   ってやってもソースなんて無いお
   たとえば リンゴ とか みかん にソースなんてかかって無いお
   まぁ 食べ物 に ソース機能があって ソース=ないお でもいいんだけど・・・