- 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
一郎さんと書こうとしたんですが、ミスって(呼び捨てで)すいません。
|