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最初のクラスでは、2 番目のクラスでオーバーライドするメソッドを定義しましたChatUIBuiderremoveUserFromListまた、プロトタイプを使用して基本クラスにもう 1 つのメソッドを追加しました。

私の問題は、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 に答える