静的メンバ《クラス・構造体》

クラス・構造体メニュー【クラスの作成・コンストラクタ・要素の更新・クラスの継承・デフォルト引数・静的メンバ】

【STEP: 1】コード

reader.on('close', () => {
  class Employee {
    constructor(number, name) {  // コンストラクターで引数の受取り
      this.number = number;  // クラス内で使用する変数に受け取った値を代入
      this.name = name;  //       〃
    }
    getnum() {  // メソッド(関数)
      return this.number;
    }
    getname() {  // メソッド(関数)
      return this.name;
    }
  }
  const N = Number(lines[0]);
  const employee = [];  // インスタンスを保存するための配列
  for (let i = 1; i <= N; i++) {
    const S = lines[i].split(' ');
    switch (S[0]) {  // S[0] が…
    case 'make':  // "make" なら…
      employee.push(new Employee(S[1], S[2]));  // インスタンスを生成して保存
      break;
    case 'getnum':  // "getnum" なら…
      console.log(employee[S[1] - 1].getnum());  // getnum()メソッドを呼び出して出力
      break;
    case 'getname':
      console.log(employee[S[1] - 1].getname());  // getname()メソッドを呼び出して出力
      break;
    }
  }
});
hogeちゃんの画像

問題の通り クラス Employee を作成しました。入力を配列に変換し S で受け取りながら S[0] の値を基準に 処理 を振り分けています。

【STEP: 2】コード

reader.on('close', () => {
  class Employee {
    constructor(number, name) {
      this.number = number;
      this.name = name;
    }
    getnum() {
      return this.number;
    }
    getname() {
      return this.name;
    }
  }
  const N = Number(lines[0]);
  const employee = [];
  for (let i = 1; i <= N; i++) {
    const S = lines[i].split(' ');
    switch (S[0]) {
    case 'make':
      employee.push(new Employee(S[1], S[2]));
      break;
    case 'getnum':
      console.log(employee[S[1] - 1].getnum());
      break;
    case 'getname':
      console.log(employee[S[1] - 1].getname());
      break;
    }
  }
});
hogeちゃんの画像

【STEP: 1】と同じコードで OK でした…。

【STEP: 3】コード

reader.on('close', () => {
  class Employee {
    constructor(number, name) {
      this.number = number;
      this.name = name;
    }
    getnum() {
      return this.number;
    }
    getname() {
      return this.name;
    }
    change_num(num) {  
      this.number = num;  // コンストラクターの値を上書き
    }
    change_name(name) {
      this.name = name;  // コンストラクターの値を上書き
    }
  }
  const N = Number(lines[0]);
  const employee = [];
  for (let i = 1; i <= N; i++) {
    const S = lines[i].split(' ');
    switch (S[0]) {
    case 'make':
      employee.push(new Employee(S[1], S[2]));
      break;
    case 'getnum':
      console.log(employee[S[1] - 1].getnum());
      break;
    case 'getname':
      console.log(employee[S[1] - 1].getname());
      break;
    case 'change_num':
      employee[S[1] - 1].change_num(S[2]);
      break;
    case 'change_name':
      employee[S[1] - 1].change_name(S[2]);
      break;
    }
  }
});
hogeちゃんの画像

【STEP: 2】のコード に  change_num(num)change_name(name) を追加して this.number と this.name の値を上書きしています。

【STEP: 4】コード

reader.on('close', () => {
  class Under_20 {
    constructor() {
      this.pay = 0;  // 支払金額
    }
    softdrink(a) {  // ソフトドリンクの注文
      this.pay += a;  // 支払金額を加算
    }
    food(a) {  // フードの注文
      this.pay += a;  // 支払金額を加算
    }
    alcohol(a) {}  // アルコールの注文
  }
  class Over_20 extends Under_20 {
    constructor() {
      super();
      this.down = false;  // フードが200円引きになるかどうかの真偽値
    }
    food(a) {  // Under_20 のメソッドを上書き
      if (this.down) {  // this.down がtrueなら…
        a -= 200;  // 200円引き
      this.pay += a;  // 支払金額を加算
    }
    alcohol(a) {  // Under_20 のメソッドを上書き
      this.pay += a;  // 支払金額を加算
      this.down = true;  // this.down を true に変換
    }
  }
  const [N, K] = lines[0].split(' ').map(Number);
  const A = [];
  for (let i = 1; i <= N; i++) {
    Number(lines[i]) >= 20 ? A.push(new Over_20()) : A.push(new Under_20());
  }
  for (let i = N + 1; i <= N + K; i++) {
    const [n, s, m] = lines[i].split(' ');
    switch (s) {
      case 'food':
      A[n - 1].food(m - 0);
      break;
      case 'softdrink':
      A[n - 1].softdrink(m - 0);
      break;
      case 'alcohol':
      A[n - 1].alcohol(m - 0);
      break;
    }
  }
 A.forEach(a => {
    console.log(a.pay);
  });
});
hogeちゃんの画像
class Under_20 {} を作成し class Over_20 extends Under_20 {} で  Under_20 {}のプロパティをOver_20 {}に読み込むことができました。子クラスに親クラスと同じ名前のメソッドを設置すると 親メソッドが上書きされるみたいね。

【STEP: 5】コード

reader.on('close', () => {
   class Under_20 {
      constructor() {
         this.pay = 0;
      }
      softdrink(a) {
         this.pay += a;
      }
      food(a) {
         this.pay += a;
      }
      alcohol(a) {}
   }
   class Over_20 extends Under_20 {
      constructor() {
         super();
         this.down = false;
      }
      food(a) {
         if (this.down) {
            a -= 200;
         }
         this.pay += a;
      }
      alcohol(a = 500) {  // デフォルト引数
         this.pay += a;
         this.down = true;
      }
   }
   const [N, K] = lines[0].split(' ').map(Number);
   const A = [];
   for (let i = 1; i <= N; i++) {
      lines[i] >= 20 ? A.push(new Over_20()) : A.push(new Under_20());
   }
   for (let i = N + 1; i <= N + K; i++) {
      const [n, s, m] = lines[i].split(' ');
      switch (s) {
         case 'food':
            A[n - 1].food(m - 0);
            break;
         case 'softdrink':
            A[n - 1].softdrink(m - 0);
            break;
         case 'alcohol':
            A[n - 1].alcohol(m - 0);
            break;
         case '0':
            A[n - 1].alcohol();
            break;
       }
   }
   A.forEach(a => {
       console.log(a.pay);
   });
});
hogeちゃんの画像

alcohol(a = 500) とすれば 引数の値を指定しなかった場合 引数の値は 500 。

【FINAL】コード

reader.on('close', () => {
   class Under_20 {
      constructor() {
         this.pay = 0;
      }
      softdrink(a) {
         this.pay += a;
      }
      food(a) {
         this.pay += a;
      }
     alcohol(a) {}
   }
   class Over_20 extends Under_20 {
      static count = 0;  // static 変数
      constructor() {
         super();
         this.down = false;
      }
      food(a) {
         this.pay += a;
         if (this.down === true) {
           this.pay -= 200;
         }
      }
      alcohol(a = 500) {
         this.pay += a;
         this.down = true;
      }
      static left() {  // static メソッド
         this.count++;  // count の前に this. をつけて static count にアクセス
      }
   }
   const [N, K] = lines[0].split(' ').map(Number);
   const A = [];
   for (let i = 1; i <= N; i++) {
      lines[i] >= 20 ? A.push(new Over_20()) : A.push(new Under_20());
   }
   let ent = 0;
   for (let i = N + 1; i <= N + K; i++) {
      const [n, s, m] = lines[i].split(' ');
      switch (s) {
         case 'food':
            A[n - 1].food(m - 0);
            break;
         case 'softdrink':
            A[n - 1].softdrink(m - 0);
            break;
         case 'alcohol':
            A[n - 1].alcohol(m - 0);
            break;
         case '0':
            A[n - 1].alcohol();
            break;
         case 'A':
            console.log(A[n - 1].pay);
            Over_20.left();  // static メソッドを呼び出し
            break;
      }
   }
  console.log(Over_20.count);  // static 変数 を出力
});
hogeちゃんの画像

tatic キーワードを使って インスタンス無しで呼び出せる変数と関数を設置しました。こんな感じで良かったのかな?

コメント