ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

C#のアクセシビリティの謎仕様

少し前に知って驚いたんですが、クラス「Class」があったとして

class Class
{
  private int _Field;
  public void Method()
  {
    Class cla = new Class()
    cla._Field = 10000;
  }
}


こういうコードは有効になるんですよ。

つまりどういうことかというと、同じクラスなら、
たとえ自分と違うインスタンスであってもprivateなメンバにアクセスできるということです。

同様に、インスタンスメソッドからprivateなスタティックメンバにアクセスすることもできますし、

スタティックメソッドからprivateなインスタンスメンバにアクセスすることも可能です。


この仕様っておかしくないですかね。

クラスが同じであっても、インスタンスが違うのですから扱い的には他人だと思うのです。

アクセスできるとは不気味です。


もしかして、自分インスタンスのクローンを作るメソッドを実装する(Prototypeパターンというらしいです)さいに、

privateなコンストラクタを定義して、引数にコピーするべきフィールドを全て用意して…とするのは可読性が損なわれるわけで、

public Class GetClone()
{
  Class cla1 = new Class(this.FieldA, this.FieldB, this.FieldC);
  // 可読性が悪い
 
  Class cla2 = new Class();
  cla.FieldA = this.FieldA;
  cla.FieldB = this.FieldB;
  cla.FieldC = this.FieldC;
}


これのcla2のようなやり方を実現するために、このような仕様にしたんですかね。

それでも、オブジェクト指向的な概念で言えば、この仕様はおかしいと思うのです。

tag: C# アクセシビリティ

コメント

質問ですが、何の通信事業者(e.g. NTT東日本、NTT西日本、eo光、auひかり)とプロバイダを使ってますか?
よろしくお願いします。

  • 2014/05/06(火) 17:56:15 |
  • URL |
  • 表記なし #-
  • [ 編集 ]

Re: 表記なし

こういうのってまあ、サーバーの管理者はアクセスログからクライアントの事業者を特定できたりして、個人情報でもないのかなと思いますが、念のため回答するのは控えます。

FC2ブログのユーザーさえもコメントした人のリモートホスト(REMOTE_HOST?)が分かるんですよ。

実はプロバイダはおまけのつもりで、主旨としては通信事業者のほうをお尋ねしたいのですが、かなわないでしょうか。

  • 2014/05/06(火) 21:47:49 |
  • URL |
  • 表記なし #-
  • [ 編集 ]

Re: 表記なし

はい、そのようになりますね。

Scalaではこれを禁止するために特定のインスタンスに対してのみ可視性を設定することができます

  • 2014/05/13(火) 12:01:01 |
  • URL |
  • test #-
  • [ 編集 ]

Re: test

C#でいうprivateは自身のインスタンスにのみ可視性を設定するわけですが、
testさんのおっしゃる特定のインスタンスとはどのようなものなのでしょうか?

まぁScalaが問題なくても、C#は今日も元気にprivateメンバにアクセスできますね~。

・・・

Javaもできるようです、これいらなくね・・・。

  • 2014/05/14(水) 13:09:39 |
  • URL |
  • funcHM #-
  • [ 編集 ]

Re: ・・・

Javaの仕様はC#とだいたい同じだと思います。
なんでこんな仕様にしたのか…。

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/340-50977d3a
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。