注意:对于那些SO开发人员来说,MS Ajax javascript库模拟了类,接口,枚举和其他OO功能,但语言不支持它。所以不要开始吹牛,javascript中没有类。
/// <reference path="MicrosoftAjax.debug.js" />
Type.registerNamespace("Validators");
Validators.IValidate = function () {
throw Error.notImplemented("Interface IValidate must be implemented before invoke.");
};
Validators.IValidate.prototype = {
ErrorMessage: "",
IsValid: false,
Validate: function () {
throw Error.notImplemented("Class must provide a implementation for the method");
}
};
Validators.IValidate.registerInterface("Validators.IValidate");
为什么我要解释与问题无关的界面?我会解释它。上面的代码将创建一个从框架中模仿IValidator的接口IValidate
。这些Error.notImplemented
代码的工作如下
new Validators.IValidate()
(即无实例Validate()
方法将在未实现时抛出错误所以现在您必须了解仿真的执行方式。同样我创建了一个类(实际上我想要一个抽象类,这就是我在这里的原因),这样命名为BaseValidator
Validators.BaseValidator = function () {
throw Error.invalidOperation("Base validator is a abstract class. Inherit the class to work with it");
};
Validators.BaseValidator.prototype = {
ValidationProperty: function (propertyName) {
},
BackColor: function (hexCode) {
},
ControlToValidate: function (id) {
},
CssClass: function (css) {
},
Display: function (mode) {
},
Focus: function () {
}
};
Validators.BaseValidator.registerClass("Validators.BaseValidator", null, Validators.IValidate);
在最后一行你可以注意到它实现了Interface(但是没有提供Implementation,因为它将由BaseValidator
类的子类提供)。当类实现接口时,继承构造函数应该调用Validators.BaseValidator.initializeBase(this)
的另一个类,它将初始化基类。现在请仔细阅读问题
Validators.RequiredFieldValidator = function () {
Validators.RequiredFieldValidator.initializeBase(this, []);
};
Validators.RequiredFieldValidator.prototype = {};
Validators.RequiredFieldValidator.registerClass("Validators.RequiredFieldValidator", Validators.BaseValidator);
RequiredFieldValidator继承BaseValidator作为基类
在构造函数中调用initializeBase(this)
来初始化基类BUT
BaseClass中的构造函数引发错误。
我应该如何使用Microsoft Asp.net Ajax模拟抽象类
答案 0 :(得分:1)
在构造函数中调用initializeBase(this)初始化基类BUT BaseClass中的构造函数抛出错误
Validators.RequiredFieldValidator = function () { };
简单地不调用超级构造函数有什么问题。如果你继承的构造函数是抽象的(无用的事情),那么根本就不要调用它。