私は 3 つの拡張可能なクラスの継承チェーンに取り組んでいます。
レンダラー (ベース) -> メールボックス (子) -> MailboxInbox (最後の子)
それぞれに独自の render
メソッドがあります。子は Renderer (Base) render
メソッドをオーバーライドするだけで、最終的には Renderer(Base
) クラスの render< /strong> メソッドを使用する必要があります。 。私の問題は、Renderer クラス (createElementWithTextInside) の特定のメソッドを実行すると、Renderer の render メソッド (Renderer . render()) が完全には実行されないことです。 )、ただし、拡張可能なクラス チェーンの最後から始まります。たとえば、
のようにトラバースを開始します。
1 - MailboxInbox.render
2 - Mailbox.render
3 - Renderer.render
js クラス/継承が舞台裏でどのように機能するかを理解しています。 JavaScript はオブジェクトのプロトタイプを拡張するだけで、スクリプトはそれらを反復処理します。しかし、私の質問は、この動作を回避し、必要に応じてメソッド内で Renderer.render メソッドを直接呼び出すにはどうすればよいでしょうか?
renderer に __self を保存することはできません。いずれにしても、現在のインスタンス (MailboxInbox) の this
を指すことになるからです。また、コンテキスト を保存する必要があるため、.bind/lambda (アロー関数)
ここではコンソールにレンダリングするだけです:
1: 受信トレイのレンダリング
2: メールボックスのレンダリング
3: レンダラーのレンダリング
###ご協力いただきありがとうございます! 敬具!
更新
基本的に、パラメータを受け入れることができる基本的な render
クラスが必要です:(el,content) (コンテンツはオプション) および
Childreni それをオーバーライドしたいと考えていました事前定義された
el や content などを独自の
.render() メソッドに含めますが、
renderer を実行しようとすると .render() メソッドは
Renderer 内から来ており、チェーン全体を通過しますが、
MailboxInbox ではレンダリング メソッドが現在パラメータを受け入れないため、パラメータが欠落しています。パラメータを受け入れてチェーン全体に渡すか、Renderer の baseRender のような専用のクラスを定義して直接呼び出します
技術的には、
に置き換えることができます。 リーリーthis.render(el, text);
を継承されたプロパティの検索をバイパスします。ただし、これは一般に良い習慣ではなく、
class
継承の利点が失われます。幸いなことに、アップデートで実際の問題が特定されました:
これは、互換性のないシグネチャを持つメソッドを誤ってオーバーライドし、 Liskov 置換原則 に違反します。
潜在的な解決策も特定しました:
どちらも良いです。後者の場合、メソッドに
render
およびbaseRender
という名前を付けるのではなく、代わりにrenderContent(el, content)
やrenderDefault (el) のような名前を付けることをお勧めします。 )
、それらの署名は実際には異なります。両方ともオーバーライドできます。ただし、2 つのパラメーターを指定して呼び出されたrender
の実装を見ると、実際にはel.appendChild(content)
を呼び出すこと以外に役立つことは何もしていないように思えます。したがって、私はそれを完全に放棄して、単にappendChild
を呼び出したいと思います (代わりにel.prepend(content)
を実行するなど、特定の動作をオーバーライドする機能が必要な場合を除きます)。