2011-09-15 22 views
2
// A convenient function that can be used for any abstract method 
function abstractmethod() { throw new Error("abstract method"); } 

// The AbstractSet class defines a single abstract method, contains(). 
function AbstractSet() { throw new Error("Can't instantiate abstract classes");} 
AbstractSet.prototype.contains = abstractmethod; 

「JavaScript:The Definitive Guide - 9.7.4クラスの階層と抽象クラス」から 私はJavaScriptで抽象クラスのユーティリティを理解しています。私が理解していないことは、エラーを投げるだけの抽象メソッドを設定する必要性または使用です。そのクラスのインスタンスを作成することはできないため、サブクラスのインスタンスのみが存在します。彼らはそれぞれ、これらのメソッドのための独自の定義を持っているでしょう、なぜ、単に汎用エラーをスローするメソッドへの継承を確立するのですか?javascriptで抽象メソッドの目的は何ですか?

ご指導いただきありがとうございます。

+3

これらはエラーをスローするため、正確に「抽象的」です。これは、抽象基本クラスの意図しない使用を防ぐためのメカニズムです。 –

+0

はい、これはコンストラクタの 'スロー'を説明します。私は何もしないだけでエラーを投げるプロトタイプメソッドの作成について混乱しています。 contains()メソッドがここでエラーを投げるのに役立つ場合、実際にはより完全に定義する最初のサブクラス(抽象コンクリート)で定義するのを待つのはなぜですか? – Marlin

+0

なぜそれを定義するのを待つのですか?これは、サブクラスが従うべき「契約」を定義する抽象/基本クラスです。それを実装するクラスは例外を取り除き、それをオーバーライドします。そうでないクラス(抽象サブクラス)は、例外を提供するためにその親クラスに依存することができます。 –

答えて

3

これは、一般的なエラーではないことを前提としています。間違った場所(つまり、サブクラスのメソッドをオーバーライドできなかったこと)を知らせるエラーです。そのメソッドを定義しなかった場合は、 "Undefined is a function"(またはそれに類するもの)というエラーが表示され、その理由を理解するためにコードを狩る時間を費やす必要があります。冗長で便利な方法。

もう1つの理由は、サブクラスを実装する下流の開発者にクラスインタフェースを指定することです。 Javascriptには正式なインタフェース宣言はありませんので、抽象クラスを検査して実装する方法がわかります。

+0

は妥当と思われますが、この抽象クラスから形成された最初の具象クラスには、その親クラスで初期化されていないメソッドが含まれているので、私は躊躇しています – Marlin

+0

@Marlin:親クラスにないメソッドを持つ子クラスは問題ありません親は抽象である)。子具体クラスが親で抽象として定義されているメソッドを実装していない場合にのみ、問題があります。 (Javaのような言語では、すべての親の抽象メソッドを実装していない具体的なクラスはコンパイルされませんが、JavaScriptでは何かを試みたときにのみ表示されるコードにランタイムエラーがスローされます'missing'メソッドを呼び出します)。 – nnnnnn

関連する問題