C ++では、APIの一貫性を保つためにNVIが必要になることがよくありました。ただし、C#では特に使用されているとは思いません。それは、言語としてのC#がNVIを不要にする機能を提供しているからではないでしょうか。(ただし、必要に応じて、C#でもNVIを使用しています。)
4 に答える
C# は、多重継承を取り除くことにより、NVI に問題を引き起こします。多重継承は善よりも悪を生み出すと思いますが、(ほとんどの場合) NVI には必要です。頭に浮かぶ最も単純なこと: C# のクラスは複数の NVI を実装できません。C#/NVI タンデムのこの不快な側面を発見すると、C# よりも NVI を放棄する方がはるかに簡単になります。
ところで、側面について言えば。これは非常に興味深い概念であり、その目的は NVI の目的とまったく同じですが、問題の「真の本質」を見て、いわば「適切に」対処しようとするだけです。見てください。
そして、.NET Framework に関する限り、まさにそれを行うためのメカニズムがあります。いわば「直交」するコードを手元のメイン ロジックに挿入します。MarshalByRef/TransparentProxy ビジネスのすべてについて話しているので、聞いたことがあると思います。ただし、パフォーマンスに深刻な影響を与えるため、ここでは大きな幸運はありません.
建物のファサードから上記のダーティ ビジネス、MSIL の後処理まで、他の手法を使用して同じ概念を実装する試みも数多く行われています。
後者のアプローチは、(ビルドルーチンに必要なステップを組み込むことによって)透過的にできるため、パフォーマンスに影響を与えない(「直交」コードを実際に実行するために絶対に必要な以上のもの)ため、本当に最も魅力的です。また、MSIL はオープンで十分に文書化されているため、何らかの「ハッキング」やリバース エンジニアリングは必要ありません。
ここでは、より詳細に説明されているこれらのポイントと、より多くの情報と実際のツールへのリンクを見つけることができます。同じ目的で Google を使用することも許容されます。:-)
幸運を。
説明は単純に、C# では「従来の」Java スタイルの OOP がはるかに根付いており、NVI はそれに反するということだと思います。C# には実際のinterface
型がありますが、NVI は実際には基底クラスである「インターフェイス」に依存しています。とにかくC++でそれが行われる方法なので、そこに自然に収まります。
C# でもそれは可能であり、非常に便利なイディオムです (「通常の」インターフェイスよりもはるかに便利です) が、組み込みの言語機能を無視する必要があります。
多くの C# プログラマーは、NVI クラスを「適切なインターフェイス」とは考えていません。この精神的な抵抗が、C# であまり一般的ではない唯一の理由だと思います。
Trey Nashは著書Accelerated C#で、NVI パターンを C# の標準形式として推進しています。
あなたが参照した記事 ( More C++ Idioms/Non-Virtual Interface )を誰が書いたのかはわかりませんが、著者は要点を見逃しているように感じます。
...
インターフェイスと抽象クラス
哲学的には、(C# では) 完全に抽象化されたクラス (つまり、実装がまったくない) とインターフェイスの間にほとんど違いはないと主張したいと思います。表面的には、どちらも実行可能なメソッドのシグネチャを提供し、その機能を実装するために何か他のものを必要とします。
C# では、必要なものがインターフェイスである場合、常にインターフェイスにプログラミングします。実装の再利用も必要なため、(抽象) 基本クラスのみを使用します。
多くのコード ベースは、インターフェイスの既定の実装としてクラス階層を提供するだけでなく、これらを組み合わせてインターフェイスにプログラムします。
C のインターフェイスの NVI
C++ で NVI を使用する唯一の動機がインターフェイスを持つことである場合、いいえ、言語/CLR はファーストクラスの機能としてインターフェイスを提供するため、C# でこれを使用するつもりはありません。
NVI とオブジェクトの階層
私の考えでは、NVI はインターフェイスに関するものではありませんでした。これは、テンプレート メソッドパターンを実装する優れた方法です。
その有用性は、コード ライフサイクルのメンテナンス (変更、拡張などの容易さ) に現れ、継承のより単純なモデルを提供します。
私の意見: はい、NVI は C# で非常に便利です。
NVI は、C++ と同様に C# でも役立つと思います。私の会社ではよく使われているようです。