CSharp_make


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

オブジェクトを作る


では、サウンドロップを作ってみましょう。

サウンドロップというおもちゃをご存知でしょうか。中央にボタンが付いていて押すと音が鳴る機械です。
機械の構造的にはただ音が違うだけです。ということは「サウンドドロップ」は「プッシュ」という振る舞いがあって、
内部に「音」というデータ(状態)を持ちます。たぶんこんだけ単純な機械だとこれしか落とし込めない気がしますが、
通常分析で出たクラスは実装中に変化してしまうものです。なので気軽に行きましょう。そんな感じの分析で作るとこうなります。

using System;

namespace SoundropNamespace{
 class Soundrop{
  string soundFileName;
  void Push(){
   playSound(soundFileName);
  }
  void SetSoundName(string filename){
   soundFileName=filename;
  }
  //参考ページより引用。
  void playSound(string filename){
   //再生されているときは止める
   if (player != null) StopSound();
   //読み込む
   player = new System.Media.SoundPlayer(waveFile);
   //非同期再生する
   player.Play();
  }
 }
}

はじめの文のままでは音を吹き込むことができませんので、SetSoundName関数もくっつけておきました。
これを運用するMain関数をどこかに定義します。メイン関数はstaticさえ付ければどこのクラスに書いてもOKなので、
そのままSoundropクラスに書き込んでしまいましょう。

using System;
using System.Media;//Systemアセンブリを参照する必要アリ。

namespace SoundropNamespace{
 class Soundrop{
  string soundFileName;
  SoundPlayer player;
  void Push(){
   playSound(soundFileName);
  }
  void SetSoundName(string filename){
   soundFileName = filename;
  }
  //参考ページより引用。
  void playSound(string filename){
   //再生されているときは止める
   if (player != null)player.Stop();
   //読み込む
   player = new System.Media.SoundPlayer(filename);
   //非同期再生する
   player.Play();
  }

  [STAThread]//おまじない、実は僕もよく分かってない(何
  static void Main(){
   Soundrop sd = new Soundrop();
   sd.SetSoundName("guil.wav");
   sd.Push();
  }
 }
}

staticはなんだったんだろう?

で、前に作ったStringProgramクラスですが、staticだらけで関数を作っていました。
これって結局なんだったんでしょうか。ためしにさっきのSoundropクラスにstaticの付いた関数を作って見ましょう。
using System;
using System.Media;//Systemアセンブリを参照する必要アリ。

namespace SoundropNamespace{
 class Soundrop{
  string soundFileName;
  SoundPlayer player;
  void Push(){
   playSound(soundFileName);
  }
  void SetSoundName(string filename){
   soundFileName = filename;
  }
  //参考ページより引用。
  void playSound(string filename){
   //再生されているときは止める
   if (player != null)player.Stop();
   //読み込む
   player = new System.Media.SoundPlayer(filename);
   //非同期再生する
   player.Play();
  }
  static void StaticTest(){
   //テストなので空処理。
  }
  [STAThread]//おまじn(ry
  static void Main(){
   Soundrop ryu = new Soundrop();
   //ryu.と入力してみて。
   //Soundrop.と入力してみて。
  }
 }
}
と、こんな風になるのですが、ではSoundrop ryu = new Soundrop(); としてryuを生成して、ryu.と打ってみてください。
いつも通りに関数が列挙されたはずです。その中に今定義したStaticTest関数はあるでしょうか?無いですよね。
んじゃあどこに行ったかというとSoundrop.と打ってみるとわかります。
そう、staticが付いた関数はSoundropクラスに属します。
そしてstaticが付かない関数はSoudropクラスによって作ることができるオブジェクトの"インスタンス"に属します。
クラスにくっついている関数は内部に状態を保持できません。つまりC言語の関数の役割とほぼ等しい感覚で利用したり定義したりできます。