2011-09-15 33 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:通用指南 - 9.7.4类层次结构和抽象类” 我了解抽象类在JavaScript中的实用程序。我不明白的是设置只会抛出错误的抽象方法的必要性或使用。您不能创建该类的实例,因此只有子类的实例存在。他们每个人都有自己的定义这些方法,所以为什么要建立一个只抛出一个通用错误的方法的继承?JavaScript中抽象方法的用途是什么?

非常感谢您的指导。

+3

他们是“抽象的”,正是因为他们抛出错误。这是一种防止抽象基类无意使用的机制,不是吗? –

+0

是的,这可以解释构造函数中的'throw'。我对创建原型方法感到困惑,它只会抛出一个错误。在我看来,如果contains()方法仅用于在这里抛出一个错误,为什么不等待在第一个子类(抽象或具体)中定义它,实际上会更完全地定义它呢? – Marlin

+0

为什么要等待定义它?它是定义子类应遵循的“合约”的抽象/基类。实现它的类将覆盖它,移除异常。不(抽象子类)的类可以只依赖其父类来提供异常。 –

回答

3

我认为这样做的目的不是一般性错误 - 这是一个错误,通知您错误的位置(即您未能覆盖子类中的方法)。如果你没有定义这种方法,你会得到一个错误,说“未定义不是一个函数”(或类似的东西),你必须花时间围绕代码来理解为什么 - 这种方式失败了更多详细而有用的方式。

另一个原因,我假设,是指示下游开发人员实现子类的类接口。 Javascript没有任何形式的正式接口声明,所以能够检查抽象类并查看我期望实现的方法很有帮助。

+0

似乎是合理的,但我犹豫不决,因为从这个抽象类形成的第一个具体类包含未在其父''中初始化的方法 – Marlin

+0

@Marlin:有一个方法不在其父类中的子类没有问题父母是抽象的)。如果子类具体类没有实现在父类中定义的抽象方法,则只有问题。 (在像Java这样的语言中,一个没有实现所有父级抽象方法的具体类甚至不能编译,但是在JavaScript中,只有当某些东西试图在JavaScript中显示时,才会显示运行时错误调用'缺少'的方法。) – nnnnnn

相关问题