私はJavaのバックグラウンドから入ってくる間にJavascript(es6)でプログラミングしています。 Javaでは、私はインターフェイス/抽象クラスをよく作成しますが、この機能はes6にはありません。一般に、ストラテジーパターンなどのデザインパターンを使用するために抽象メソッドを書くのが好きです。私は他の人が抽象クラスの独自のバージョンを実装しようとしているのを見ましたが、特に好きではありません。Javascript(es6)のOOP言語の抽象メソッドの動作を実現する最善の方法は何ですか?
Animal
という抽象クラスがあり、抽象メソッドcry
があるとします。私が見てきた何より、Javascriptのコードは次のようになります。
class Animal {
constructor() {
if (new.target === Animal) {
throw new TypeError("Cannot construct Animal instances directly");
}
}
cry() {
throw new Error('You have to implement the method cry!');
}
}
とのはCat
とDog
がAnimal
のサブクラスであるとしましょう。次に、それらの実装次のようになります。私はこのコードについては好きではありません
class Cat extends Animal {
cry() {
return 'meow';
}
}
class Dog extends Animal {
cry() {
return 'woof';
}
}
何があなたがクラスは抽象クラスであることを示すために例外文を書かなければならないということです。
しかし、私は、コールバックとファクトリメソッドを使用する方が良いアプローチだと思います。抽象クラスに抽象メソッドを持たせるのではなく、抽象クラスにコールバック関数を渡し、これを想定した抽象メソッドとして使用することができます。 Animal
例は、以下のものに変更することができます。
class Animal {
constructor(cryCallback) {
this.cryCallback = cryCallback;
}
cry() {
return this.cryCallback();
}
}
Cat
とDog
オブジェクトのインスタンスを作成するためには、基本的にファクトリメソッドでそれらを作成することができます。それは次のようになります。
function createCat() {
return new Animal(() => 'meow');
}
function createDog() {
return new Animal(() => 'woof');
}
あなたがCat
インスタンスを作成し、cry
を呼び出した場合、それは次のようになります。
console.log(createCat().cry()); //meow
このアプローチを使用することの利点は、あなたが実際にはないことですcry
を実装する必要があるため、Animal
のインスタンスを呼び出します。次に、Cat
オブジェクトまたはDog
オブジェクトの作成をファクトリメソッドで隠すことができます。
このアプローチについてどう思いますか教えてください。 Javascriptで抽象メソッドを実現するためのより良いアプローチはありますか?
使用typeecriptが、それはあなたがしているもののためにシンタックスシュガーを提供します。あなたは、(コードが正しいかどうかはチェックしませんでした)このような何かを行うことによって、これらの2の混合を行うことができを参照してください。Typescriptは、コンパイル時にオプションの型チェックを提供します – Dummy