3

我试图interface在. 并遇到了绊脚石。这是代码示例:JSC#

    // Interface for UIBuilder classes
    function IUIBuilder() {
        this.addUserToList = function () {
            alert('parent: added');
        };
    }

    // Class implementing the IUIBuilder
    function ChatUIBuider() {
        IUIBuilder.prototype.addUserToList = function () {
            alert('child: added');
        };
        IUIBuilder.prototype.removeUserFromList = function () {
            alert('child: removed');
        };

        return new IUIBuilder();
    }

在第一堂课中,我定义了一个addUserToList在第二堂课中重写的方法ChatUIBuider。还removeUserFromList使用其原型向基类添加了另一种方法。

我的问题是,addUserToList即使在子类中被覆盖后,该方法仍会调用父类方法。为什么?

    var builder = new ChatUIBuider();
    builder.removeUserFromList(); // Invokes the child class method. - CORRECT
    builder.addUserToList(); // Invokes the base class method- WHY??

谁能告诉我这是否是我正在做的正确方式?

4

2 回答 2

3

我建议这个结构:

function IUIBuilder() {
};
IUIBuilder.prototype.addUserToList = function () {
    alert('parent: added');
};

// Class extending the IUIBuilder
function ChatUIBuider() {
}
ChatUIBuider.prototype = new IUIBuilder();
ChatUIBuider.prototype.addUserToList = function () {
        alert('child: added');
};
ChatUIBuider.prototype.removeUserFromList = function () {
        alert('child: removed');
};

ChatUIBuider 扩展了 IUIBuilder 并继承了它的功能,但覆盖了该addUserToList功能。

在以下代码中,将调用两个构造函数,但仅调用覆盖addUserToList函数:

var chat = new ChatUIBuider();
chat.addUserToList();

演示

于 2012-11-29T07:28:53.837 回答
1

@Denys 重组了整个代码,但没有明确指出问题所在。问题addUserToList不是您的父类的原型方法,而是为每个实例复制的方法this,而不是 sahred。因此,只需将其转换为prototype方法即可解决问题。

 // Interface for UIBuilder classes
    function IUIBuilder() {
    }
    IUIBuilder.prototype.addUserToList = function () {
            alert('parent: added');
    };

    // Class implementing the IUIBuilder
    function ChatUIBuider() {
        IUIBuilder.prototype.addUserToList = function () {
            alert('child: added');
        };
        IUIBuilder.prototype.removeUserFromList = function () {
            alert('child: removed');
        };

        return new IUIBuilder();
    }
    var builder = new ChatUIBuider();
    builder.removeUserFromList(); // Invokes the child class method. - CORRECT
    builder.addUserToList(); // Invokes the CHILD CLASS's METHOD
于 2016-02-25T08:17:14.250 回答