[解決済み】なぜC#はC++スタイルの'friend'キーワードを提供しないのですか?[クローズド]
質問
は
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つのクラスの実装を結合することであり、単にインターフェースを結合するよりもずっと悪いことなのです。
関連
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
-
[解決済み】C#のyieldキーワードは何に使われるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] 現在のメソッドを呼び出したメソッドを見つけるにはどうすればよいですか?
-
[解決済み] C++で'friend'はいつ使うべきですか?
-
[解決済み】C#のfriendに相当するものは何ですか?[重複している]。