- PR -

特定のクラスのみ別クラスのプロパティへのアクセスを許可したい

投稿者投稿内容
ani
常連さん
会議室デビュー日: 2007/05/17
投稿数: 44
投稿日時: 2008-02-22 09:51
こんにちは。
いつもお世話になっております。

Windows アプリケーションでデータを設定、取得するためのクラスを作成しております。

コード:
'個人情報クラス
Public Class Personal

   Private mName As String
   Private mAddress As String
   Private mAge As Integer

   Public ReadOnly Property Name As String
        Get
            Return Me.mName
        End Get
    End Property

End Class

'個人情報クラス
Public Class Company

   Private mCompanyName As String
   Private mEmployees As New List(Of Personal)

   Public Sub New()
      Dim personal As New Personal()
      Console.WriteLine(personal.Name)
      personal.Name = "IT太郎" 'これを可能にしたい
      mEmployees.Add(personal)
   End Sub

End Class

'フォームクラス
Public Class Form1

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      Dim personal As New Personal()
      Console.WriteLine(personal.Name)
    End Sub

End Class


上記コードで Personal クラスのプライベートな変数 mName に対して、
・ Company クラスからは設定、取得可能
・ Form1 クラスからは取得のみ可能
ということがしたいのですが、どのようにすればよいでしょうか?
クラスの継承などを利用すればできそうな気がするのですが、いまいち分かりません。
ちなみに全てのクラスが同一アセンブリにあります。

初歩的なことで申し訳ありませんが、どうかご教示下さい。

<環境>
Windows XP, .NET Framework 2.0, Visual Studio 2005, Visual Basic
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-02-22 10:01
引用:

aniさんの書き込み (2008-02-22 09:51) より:

上記コードで Personal クラスのプライベートな変数 mName に対して、
・ Company クラスからは設定、取得可能
・ Form1 クラスからは取得のみ可能
ということがしたいのですが、どのようにすればよいでしょうか?


Personal クラスと Company クラスを別アセンブリに分離して mName をプロパティ化し Set アクセサは Friend、Get アクセサは Public とする。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ani
常連さん
会議室デビュー日: 2007/05/17
投稿数: 44
投稿日時: 2008-02-22 10:34
>じゃんぬねっとさん
レスありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2008-02-22 10:01) より:

Personal クラスと Company クラスを別アセンブリに分離して mName をプロパティ化し Set アクセサは Friend、Get アクセサは Public とする。


やはり別アセンブリに分離しないと実現できないのですか。
別アセンブリとは別プロジェクトですよね。
別プロジェクトにはできないので他の方法を検討したいと思います。

どうもありがとうございました。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2008-02-22 13:56
Form1にはPersonalを直接触らせないのがいいんじゃないですか。
Personalの値が欲しい時にCompanyにお願いして値だけを取得するとか。
Personalの属性をセットで欲しいなら、値を持つだけの
コード:
Public Class Personal2
   Public ReadOnly Name As String
   Public ReadOnly Address As String
   Public ReadOnly Age As Integer

   Public Sub New(name As String, address As String, age As Integer)
      Me.Name = name
      Me.Address = address
      Me.Age = age
   End Sub
End Class


こういうクラスを作って、これで値をもらうことにするとか。
(Personal2って名前はまずいですけど)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-02-22 14:11
引用:

aniさんの書き込み (2008-02-22 09:51) より:
上記コードで Personal クラスのプライベートな変数 mName に対して、
・ Company クラスからは設定、取得可能
・ Form1 クラスからは取得のみ可能
ということがしたいのですが、どのようにすればよいでしょうか?
クラスの継承などを利用すればできそうな気がするのですが、いまいち分かりません。


オブジェクト指向のデザインパターンでの、Proxy パターンか Decorator パターンあたりになるのだろうと思います。

ただ、なんのために Company と Form1 でアクセスの権限を違わせるのか、という疑問があります。
ひとつの推測ですが、読み取りだけをおこなう場面で間違って書き込んでしまうような操作間違いを防ぐというようなことでしょうか?もしそうだとしたら、そういう書き込みをしないようにするだけにしたほうが良いと思います。ソフトウェアにおける「読み取り専用」のような属性は、ファイルサーバーのファイルの持つ「読み取り専用」の属性とは同じとは考えないほうが良いと思います。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-02-22 14:41
一郎と同じですが、そもそもPersonal直接アクセスはよくないと感じます。
するとなれば、Company経由でアクセスコントロールですね。
(もしPersonalが必要であれば、Companyから新しいクラスPersonalCollectionにRegisterする様な感じかな?これではアクセスの方法は回避できないですが)

参考になればと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-02-22 15:05
引用:

unibonさんの書き込み (2008-02-22 14:11) より:
オブジェクト指向のデザインパターンでの、Proxy パターンか Decorator パターンあたりになるのだろうと思います。


なお、どんなパターンを使えば良いかは良く分かりませんが、いずれにしても、普通は、最初に読み書きができるクラスがあって、それに依存した読み取り専用のクラスを後から作ることが多いでしょう。逆は難しいと思います。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-02-22 15:32
一郎さんと書こうとしたんですが、ミスって(呼び捨てで)すいません。

スキルアップ/キャリアアップ(JOB@IT)