1. ホーム
  2. c#

[解決済み】なぜC#はC++スタイルの'friend'キーワードを提供しないのですか?[クローズド]

2022-04-10 02:59:18

質問

C++のフレンドキーワード を使用すると class A を指定することができます。 class B を友人とする。 これによって Class B にアクセスすることができます。 private / protected のメンバー class A .

なぜこれがC#(とVB.NET)から省かれたのか、私は何も読んだことがありません。これに対するほとんどの回答は 以前のStackOverflowの質問 C++の便利な部分であり、それを使用する正当な理由があると言っているように見えます。 私の経験では、同意せざるを得ません。

もう一つ 質問 と同じようなことをするにはどうしたらいいのか、ということを聞いているように思えます。 friend をC#アプリケーションで使用することができます。 一般的に、答えはネストされたクラスを中心に展開されますが、C#のアプリケーションで friend というキーワードがあります。

オリジナルの デザインパターンブック は、その例を通して定期的に使用されています。

つまり、要約すると、なぜ friend そして、C#でこれをシミュレートするベストプラクティスとは何でしょうか?

(ちなみに internal キーワードは ではなく 同じことです。 すべて にアクセスすることができます。 internal のメンバーであり、一方 friend を使用すると、特定のクラスに 完全なアクセス への ちょうど1つ 他のクラス)

解決方法は?

プログラミングにおいて友達を持つことは、多かれ少なかれ、汚く、悪用されやすいと考えられています。クラス間の関係を壊し、OO言語の基本的な特性を台無しにしてしまいます。

とはいえ、これはいい機能で、私自身もC++で何度も使っていますし、C#でも使ってみたいと思っています。しかし、C#のquot;pure" OOness(C++のpseudo OOnessと比較して)のために、MSはJavaにはfriendキーワードがないのでC#にもないはずだと決めたのでしょう(冗談です;)。

真面目な話、internalはfriendほどではないですが、仕事はできます。DLLを通じてではなく、サードパーティの開発者にコードを配布することは稀であることを忘れないでください。したがって、あなたとあなたのチームが内部クラスとその使用について知っている限り、あなたは問題ないはずです。

EDIT friendというキーワードがどのようにOOPを損なっているのか、明らかにしましょう。

プライベート変数とメソッドの保護は、おそらくOOPの最も重要な部分の1つです。オブジェクトが自分だけが使えるデータやロジックを保持できるという考え方は、機能の実装を環境から独立して書くことを可能にし、環境が処理に適さない状態情報を変更できないようにします。フレンドを使うことは、2つのクラスの実装を結合することであり、単にインターフェースを結合するよりもずっと悪いことなのです。