[解決済み] ECMAScript 6 には抽象クラスに関する規約がありますか?重複
2022-04-20 02:23:14
質問
ES6を読んでいて、抽象クラスについて何も書かれていないことに驚きました。(抽象クラスとは、Javaでいうところの、抽象クラスがメソッドシグネチャを宣言し、それをサブクラスが実装しなければインスタンス化できない、という意味です)。
ES6で抽象クラスを実装するために行われた規約をご存知の方はいらっしゃいますか?静的解析で抽象クラス違反を捕まえられるといいんだけど。
抽象クラスのインスタンス化の試みを知らせるために、実行時にエラーを発生させるとしたら、どのようなエラーになるでしょうか?
解決方法は?
ES2015 には、希望するデザイン・パターンを実現するためのアフォーダンスが組み込まれた Java スタイルのクラスはありません。しかし、何を達成しようとしているかに応じて、役に立つかもしれないいくつかのオプションがあります。
構築できないがサブクラスは構築できるクラスが欲しい場合は
new.target
:
class Abstract {
constructor() {
if (new.target === Abstract) {
throw new TypeError("Cannot construct Abstract instances directly");
}
}
}
class Derived extends Abstract {
constructor() {
super();
// more Derived-specific stuff here, maybe
}
}
const a = new Abstract(); // new.target is Abstract, so it throws
const b = new Derived(); // new.target is Derived, so no error
の詳細については
new.target
ES2015 のクラスがどのように機能するかについての一般的な概要をお読みください。
http://www.2ality.com/2015/02/es6-classes-final.html
もし、特定のメソッドを実装することを特に求めているのであれば、スーパークラスのコンストラクタで確認することができます。
class Abstract {
constructor() {
if (this.method === undefined) {
// or maybe test typeof this.method === "function"
throw new TypeError("Must override method");
}
}
}
class Derived1 extends Abstract {}
class Derived2 extends Abstract {
method() {}
}
const a = new Abstract(); // this.method is undefined; error
const b = new Derived1(); // this.method is undefined; error
const c = new Derived2(); // this.method is Derived2.prototype.method; no error
関連
-
vueディレクティブv-bindの使用と注意点
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
[解決済み] JavaScriptには、与えられた範囲内の範囲を生成する "range() "のようなメソッドがありますか?
-
[解決済み] 抽象クラスはコンストラクタを持つことができますか?
-
[解決済み] 抽象クラスをユニットテストする方法:スタブで拡張する?
-
[解決済み] JavaScriptにはinterface型(Javaの'interface'など)はありますか?
-
[解決済み】Pythonで抽象基底クラスを使用する理由は?
-
[解決済み】Mockitoを使用して抽象クラスをテストする
-
[解決済み】Pythonで抽象クラスを作ることは可能か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
Vueの要素ツリーコントロールに破線を追加する説明
-
JSアレイループと効率解析の比較
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
Vueのフィルタの説明
-
[解決済み】リソースの読み込みに失敗した:Bind関数でサーバーが500(Internal Server Error)のステータスで応答した【非公開
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
[解決済み] ES6構文とBabelでJavascriptのエラーを拡張する