問題タブ [non-virtual-interface]
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.
c++ - 継承の 2 つ以上のレベルの非仮想インターフェイスのイディオム?
非仮想インターフェイスのイディオムは、仮想メソッドが非パブリック カスタマイズ ポイントであり、パブリック メソッドが非仮想であり、基本クラスがカスタマイズ ポイントの呼び出し方法を常に制御できるようにする方法を説明します。
これはエレガントなイディオムであり、私はそれを使用するのが好きですが、派生クラスがそれ自体が基底クラスである場合、どのように機能しますか?
c# - Non-Virtual Interface(NVI)イディオムはC ++と同じくらいC#で役立ちますか?
C ++では、APIの一貫性を保つためにNVIが必要になることがよくありました。ただし、C#では特に使用されているとは思いません。それは、言語としてのC#がNVIを不要にする機能を提供しているからではないでしょうか。(ただし、必要に応じて、C#でもNVIを使用しています。)
c++ - How to implement an interface class using the non-virtual interface idiom in C++?
In C++ an interface can be implemented by a class whose methods are pure virtual.
Such a class could be part of a library to describe what methods an object should implement to be able to work with other classes in the library:
:
Now I want to to use class Lib::Bar
, so I have to implement the IFoo
interface.
For my purposes I need a whole of related classes so I would like to work with a base class that guarantees common behavior using the NVI idiom:
The non-virtual interface (NVI) idiom ought to deny derived classes the possibility of overriding the common behavior implemented in FooBase::method()
, but since IFoo
made it virtual it seems that all derived classes have the opportunity to override the FooBase::method()
.
If I want to use the NVI idiom, what are my options other than the pImpl idiom already suggested (thanks space-c0wb0y).
c++ - C ++:NVIとテンプレートメソッドパターンの違いは?
NVI(非仮想インターフェイス)とテンプレートメソッドパターンの違いは何ですか?
それらは非常に似ているように見え、基本的に同じであり、テンプレートが何らかの形でより一般的であるという点で微妙に異なることの両方を読みました。
design-patterns - プライベートメソッドパターンのプライベートオーバーライド?(回答:NVI)
仮想的にのみ、およびベース内の他のメソッドから呼び出されることを意図したメソッドを説明するために受け入れられている専門用語(ある場合)は何ですか?これがコールバックと呼ばれるのを時々見ましたが、それはその用語の元の定義からかなり外れているようです。これがパターンと呼ばれるメリットがあるかどうかさえわかりませんが、コードのコメントをより正確にしようとしています。助けてくれてありがとう!
概要:これは、テンプレートメソッドパターンの特殊なケースである非仮想インターフェイスパターンと呼ばれているようです。助けてくれたニックとスティーブンに感謝します!
c++ - 非仮想派生: コンパイラから実際に得られるものは何ですか?
非仮想派生を使用する場合、コンパイラによって何が生成されるのか疑問に思っています。
ここでの派生は、コンパイル時のチェックのみを意味しますか? それとも他のオーバーヘッドがありますか?
Point2
or を直接使用すると、コンパイラが同じサイズのオブジェクトを生成することに気付きましたPoint<2>
。派生によって vtable が発生しなかったと推測されるため、仮想呼び出しは行われません。
何か不足していますか?
環境
特定のクラス テンプレートの定義済みの特殊化をいくつか提供したいと考えています。私はtypedefから始めました:
残念ながら、これにより、クライアントは「単純な」前方宣言を使用できなくなります。
次に、このかなり直感的でないコードを記述することが必須になります。
これが、typedef を破棄し、非仮想派生を使用した理由です。それでも、私はすべての意味が何であるか疑問に思っています。
(別の戦略は、前方宣言を専用のヘッダー ファイルに 1 回記述することです#include <iosfwd>
。)
c++ - プライベートの純粋仮想関数のポイントは何ですか?
ヘッダーファイルで次のコードに出くわしました。
私にとって、これは、Engine
クラスまたはそれから派生したクラスのいずれかが、これらの純粋仮想関数の実装を提供する必要があることを意味します。しかし、派生クラスがそれらを再実装するためにそれらのプライベート関数にアクセスできるとは思いませんでした-それでは、なぜそれらを仮想化するのですか?
java - Java最終メソッドとC ++非仮想関数
javaの最終メソッドとc ++の非仮想メソッドは異なりますか、それとも同じですか? どのように?
c++ - 非仮想インターフェース-正しい仮想関数を呼び出す方法
次のような階層があります。
したがって、問題は、Baseクラスを使用して派生を作成するときに、このパターンを使用してExecute()を呼び出す方法です。私の場合、Baseから派生した複数のクラスがあり、条件によっては別の派生クラスを選択する必要があるため、Derivedを直接作成したくありません。
誰か助けてもらえますか?
c# - C#/C++での非仮想インターフェイスデザインパターン
インターフェイスを設計するとき、誰かが非仮想インターフェイスパターンを使用することを推奨しました。誰かがこのパターンの利点が何であるかを簡単に概説できますか?