- ホーム
- ブログ
- Google Apps Script
- GASを使って学ぶオブジェクト指向〜クラスの継承とポリモーフィズム
今回の記事は、Google Apps Scriptでポリモーフィズムの挙動がわかるコードを作成してみようという、初心者向けの記事です。 ポリモーフィズム(多態性)とは、同じ名前のメソッドが、異なるクラスで、異なる振る舞いをするという概念です。
親となる"Cardクラス"を作成し、そのクラスを継承した子クラス"WaribikiCouponクラス"、"NebikiCouponクラス"、"MemberCardクラス"を作成します。
また、"Cardクラス"を継承しない"MemberCardNotExtendsクラス"を作成します。
これらのクラスを動かす"Casherクラス"を作成して、同じメソッドで違う振る舞いをする確認と、継承クラスと非継承クラスの違いを確認します。
親クラスとなる"Cardクラス"を作成します。抽象クラスで作成したいのですが、javascriptには抽象クラスという概念がないので、通常のクラスで作成します。
class Card {
constructor(name) {
this.name = name;
}
pay() {
throw new Error('payメソッドは、サブクラスによってオーバーライドされなければならない'); //継承クラスがメソッドをオーバーライドしない場合、エラーを発生させる
}
point(){
throw new Error('pointメソッドは、サブクラスによってオーバーライドされなければならない'); //継承クラスがメソッドをオーバーライドしない場合、エラーを発生させる
}
}
"Cardクラス"を継承した子クラスとして"WaribikiCouponクラス"、"NebikiCouponクラス"、"MemberCardクラス"を作成します。
子クラス名
extends 親クラス名
でクラスを継承できます。親クラスのコンストラクタはsuper()
で呼び出すことができます。
class WaribikiCoupon extends Card {
constructor(name, rate) {
super(name);
this.rate = rate;
}
pay(total) {
return total - (total * this.rate);
}
point(){
return 0;
}
}
class NebikiCoupon extends Card {
constructor(name, amount) {
super(name);
this.amount = amount;
}
pay(total) {
return total - this.amount;
}
point(){
return 0;
}
}
class MemberCard extends Card {
constructor(name, rate, pointRate) {
super(name);
this.rate = rate;
this.pointRate = pointRate;
}
pay(total) {
return total - (total * this.rate);
}
point(total) {
return total * this.pointRate;
}
}
"Cardクラス"を継承しない"MemberCardNotExtendsクラス"を作成します。 継承クラスとの違いを確認するためのクラスです。
class MemberCardNotExtends {
constructor(name, rate, pointRate) {
this.name = name;
this.rate = rate;
this.pointRate = pointRate;
}
pay(total) {
return total - (total * this.rate);
}
point(total) {
return total * this.pointRate;
}
}
"Casherクラス"はポリモーフィズムを実行するためのクラスです。
class Casher {
static check(total, card) {
const newTotal = card.pay(total);
const point = card.point(total);
// Cardクラスの継承クラスのみ実行される
if (card instanceof Card) {
console.log(card.name + 'を使ったので,支払いは' + newTotal + '円、ポイントは' + point + 'になります');
} else {
console.log("エラー、" + card.name + "は、Cardクラスを継承していません");
}
}
}
実行するためのメイン処理です。
function main() {
// 継承クラスのインスタンス作成
const coupon1 = new NebikiCoupon("300円引きクーポン", 300);
const coupon2 = new WaribikiCoupon("1割引きクーポン", 0.1);
const memberCard = new MemberCard("メンバーカード", 0.05, 0.01);
// 継承なしクラスのインスタンス作成
const memberCard2 = new MemberCardNotExtends("メンバーカード2", 0.05, 0.1);
// Casherクラスの実行
const teika = 5000;
Casher.check(teika, coupon1);
Casher.check(teika, coupon2);
Casher.check(teika, memberCard);
Casher.check(teika, memberCard2);
}
instanceof
演算子は、オブジェクトが特定のクラスのインスタンスであるかどうかを判定します。
console.log(memberCard instanceof Card); // true
console.log(memberCard2 instanceof Card); // false
実行ログ
11:25:25 情報 300円引きクーポンを使ったので,支払いは4700円、ポイントは0になります
11:25:25 情報 1割引きクーポンを使ったので,支払いは4500円、ポイントは0になります
11:25:25 情報 メンバーカードを使ったので,支払いは4750円、ポイントは50になります
11:25:25 情報 エラー、メンバーカード2は、Cardクラスを継承していません
11:25:25 情報 true
11:25:25 情報 false
クラスの継承を使ったポリモーフィズムを実装する利点としては以下のようなものがあります。
他の子クラスの追加や、親クラスのメソッドの変更などをしてみて確認してみると、クラスの継承とポリモーフィズムの理解が深まると思います。
またJavaScriptは、動的型付け言語になります。静的型付け言語であるjavaなどで同じようなコードを書いてみると、型付けの違いを感じることができるかもしれません。 参考になれば幸いです。
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More