クラス・構造体メニュー【クラスの作成・コンストラクタ・要素の更新・クラスの継承・デフォルト引数・静的メンバ】
【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;
}
}
});
問題の通り クラス 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;
}
}
});
【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;
}
}
});
【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);
});
});
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);
});
});
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 変数 を出力
});
tatic キーワードを使って インスタンス無しで呼び出せる変数と関数を設置しました。こんな感じで良かったのかな?
コメント