問題タブ [template-method-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
172 参照

c++ - C++ では、基本関数の派生クラスのメンバーにどのようにアクセスしますか? (これは正しい練習ですか?)

いくつかのアルゴリズムを使用してオブジェクトの範囲を概算するために、C++ で物理プログラムを作成しています。具象メソッドと抽象メソッドの両方を含む基本クラス Simulation を宣言しました。(たとえば、範囲を概算する関数は純粋な仮想ですが、次の位置を取得する関数は具体的です。これはアルゴリズムに関係なく同じです。) これらの具体的なメソッドを定義するために、基本クラスですべての変数を宣言しました。同じように。派生クラスでは、基本クラスの抽象メソッドと新しいアルゴリズム固有のメソッドの両方を定義します。これには、基本クラスと派生クラスの両方でメンバーを定義する必要があります。

問題は、基本クラスで定義された具体的なメソッドが、派生クラスで定義されたオーバーライドされたものではなく、基本クラスのメンバーにアクセスしていることです。これを行う方法はありますか、それとも私のアプローチ自体が間違っていますか?

コンストラクターにも同様の問題があります。派生クラスのコンストラクターから基本コンストラクターを呼び出すと、基本メンバーが初期化されます。

とにかく、お時間をいただきありがとうございます。私は C++ にまったく慣れていないわけではありませんが、C として使用する傾向がありました。私はオブジェクト指向の概念にあまり慣れていません。私は非常に初歩的な間違いを犯している可能性があります (または、設計上の欠陥である可能性が高い) が、派生クラスでメソッドを再定義する以外のテストで、類似したものを見つけられなかったり、肯定的な結果が得られたりしたことはありません。(これは避けるべきだと思います)

更新: メンバーを保護することはできましたが(Ozraptor に感謝します。どうやってそれを見逃したのかよくわかりません)、R Sahu の要求に従って、(現在更新された) コードの一部を投稿します。

基本クラス:

派生クラスの 1 つ:

0 投票する
1 に答える
732 参照

android - 「Androidアクティビティライフサイクル」はテンプレートメソッドパターンを使用していますか?

Template メソッド パターンには、アルゴリズムの各ステップをカプセル化することが含まれていると思います。

アクティビティのライフ サイクル (onCreate、onResume など) は、具体的なクラスによってオーバーライドする必要があるステップだと思います。

これは、Android のアクティビティ ライフサイクル (アクティビティ クラスとフラグメント クラス) がテンプレートのデザイン パターンに準拠していることを意味するのでしょうか、それともより適した別のパターンがあるのでしょうか。

ありがとう

0 投票する
1 に答える
42 参照

design-patterns - テンプレートメソッドパターンの重要な戦略は何ですか

あるインタビューで、テンプレート メソッド パターンの主要な戦略について尋ねられました。私は継承と答えました。これは正しい答えですか?誰かが私を正しい方向に導くことができれば?前もって感謝します。

0 投票する
1 に答える
280 参照

java - Java テンプレート メソッド パターン

データセットで何らかの処理作業を行ういくつかの JavaEE Bean 内で、テンプレート メソッド パターンの行に沿って何かを実装しようとしています。

各処理 Bean は Job オブジェクトを受け取り、いくつかの作業を行い、次の Bean (合計で約 10) の更新されたジョブを返します。各 Bean には、同じ名前 (doProcessing) と単一の引数 (job) を持つ単一のメソッドがあります。

各 Bean の「doProcessing」メソッドの開始時と終了時にロギングを実行して、処理の最後にジョブに各 Bean からのロギング情報が含まれるようにしたいと思います (ハッシュマップなどに保存されます)。

私の現在の実装は次のようになります...

しかし、継承を使用して、次の行に沿ってスーパークラスを作成できるはずです...

また、スーパークラスを拡張するクラスはすべて、前処理/後処理アクションを自動的に実行します...

しかし、すべての例が POJO を参照しており、私の Bean は @Stateless であるため、コンストラクターがないため、これを正確に実装する方法を見つけることができませんでした。

誰かがこれに関するガイダンスを提供できますか? 私は間違った木を吠えていますか?

0 投票する
2 に答える
327 参照

java - 戻り値を持つテンプレート メソッド

アルゴリズムの概要があります。特定の順序で実行する必要があるいくつかの論理ステップです。アルゴリズムの結果は何らかの数値でなければなりません。当然、これはテンプレート メソッド パターンを使用するというアイデアにつながりました。これはvoidメソッドでは問題なく機能しますが、ここで問題が発生します。アルゴリズムの各ステップはvoidメソッドではありませんが、数値を返すことが許可されています (したがって、intメソッドです)。ステップがゼロ以外の数値を返す場合、この数値はアルゴリズムの実行結果。ゼロの場合、実行は次のステップに進みます。

これは本当に些細なことに聞こえるかもしれませんが、次のようなものを持つのはなんとなく醜いと思います。

もちろんstep1()step2()などは抽象メソッドであり、私のものを拡張する対応するクラスに独自の特定の実装があります。

私の頭に浮かんだもう 1 つのアイデアは、例外を使用することでしたが、ここで制御フローについて話しているので、これはアンチパターンになります。

ここに何かが欠けていますか、それともこれは私がそれを書かなければならない方法ですか?

0 投票する
2 に答える
141 参照

c++ - オブジェクトに値のセマンティクスがある場合、メソッド内の仮想関数をインライン化する

テンプレート メソッドの設計パターンを使用した次のコードを検討してください。

ケース 1 と 2 でコンパイラが「doSomething()」メンバー関数をインライン化/非仮想化できるかどうか疑問に思っています。これは、templateMethod() の 3 つの異なるバイナリ コードを作成する場合に可能です: A::doSomething() または B::doSomething() のいずれかをインライン化 (ケース 3、1、および 2 でそれぞれ呼び出す必要があります)

この最適化が標準で必要かどうか、またはコンパイラがそれを実装しているかどうかを知っていますか? CRT パターンを使用し、仮想パターンを使用せずに同じ種類の効果を達成できることはわかっていますが、意図はあまり明確ではありません。