プロが教えるわが家の防犯対策術!

いつもお世話になっております。

vb.netでプログラムを組んでいるのですが
分からない箇所があり質問させていただきます。

クラス1を作成し、プロパティを2つ用意します。

別のクラス2からそのクラス1を使うのですが
プロパティが1つでいい場合と2つ必要な場合があります。

どうにかしてプロパティの数を変更したいのですが、方法が分かりません。

以下にサンプルを記します。

=================================================

Public Class TestClass1

Private _Text As String

Public Property Sample As String
Get
Return _Text
End Get
Set(value As String)
_Text = value
End Set
End Property

Private _Word As String

Public Property Word As String
Get
Return _Word
End Get
Set(value As String)
_Word = value
End Set
End Property


Public Sub New()
_Word = "aaa"
End Sub

End Class


Public Class TestClass2

Private _TestStyle As New List(Of TestClass1)

Public Property TestStyle As List(Of TestClass1)
Get
Return _TestStyle
End Get
Set(value As List(Of TestClass1))
Try
_TestStyle = value
Catch ex As Exception
Throw
End Try
End Set
End Property

End Class


=================================================

上記のプロパティは
Wordは常に必要ですが、Sampleは不要な時は非表示にしたいです。



どういう方法があるのか調べてみてもよくわかりません。

お手数をおかけしますが、よろしくお願いいたします。

A 回答 (3件)

「表示」「非表示」とは、具体的にどこにどう「表示」されることなのですか?



普通は
・Sampleプロパティの有無でクラスを分ける
・無視する
ってあたりだと思います。
    • good
    • 0
この回答へのお礼

kmee様

ご回答ありがとうございます。


プロパティの上部に以下を付与すると非表示になることはわかるのですが
 「<System.ComponentModel.Browsable(False)> _」

TestClass2のプロパティを用いて表示/非表示を切り替えられないかと思っています。


下記サイトを参考にしたのですが、私の理解が足らずにうまく動いていない現状です。。。

[PropertyウィンドウまたはPropertyGridの表示内容の動的変更]
https://social.msdn.microsoft.com/Forums/ja-J...

[プロパティの表示非表示の切り替えについて]
http://bbs.wankuma.com/index.cgi?mode=al2&amp...


>普通は
> ・Sampleプロパティの有無でクラスを分ける
> ・無視する
> ってあたりだと思います。

そうですね。
とりあえず無視する方向で、もう少し勉強致します。

お礼日時:2020/11/25 12:06

使う必要があるかないかは、クラスの設計によるでしょう。


必要がなくても、プロパティとして存在しており、それを利用すればクラスの設計として、そのプロパティの内容に応じて動作に多少の変化が起こる、というだけの話なら、1つのクラス内で2つのプロパティが存在していても全く問題ありません。
この場合、必要のない場面で必要のないプロパティを設定していること自体が問題になり、クラス設計として問題になることはありません。

そうではなく、必要がある場面と必要がない場面で、そもそも振る舞いとして全く異なる動作を求めるのであれば、クラス設計において責任範疇が混在しているため、クラスを切り分けた方が自然です。

提示されている例ではプロパティしかコードがないため、どうあるべきか、という判断はつきません。
が、下記は方法論としてのコードです。

Wordプロパティを有するクラスがベースと考えるならば、Sampleプロパティを有するクラスを継承して用意すればいいかと思います。

===========================
Public Class TestClass1
Private _Word As String

Public Property Word As String
Get
Return _Word
End Get
Set(value As String)
_Word = value
End Set
End Property

Public Sub New()
_Word = "aaa"
End Sub
End Class

Public Class TestClass1Ex
Inherits TestClass1

Private _Text As String

Public Property Sample As String
Get
Return _Text
End Get
Set(value As String)
_Text = value
End Set
End Property

Public Sub New()
MyBase.New()
End Sub
End Class
===========================

とある処理でTestClass1、TestClass1Exの違いを認識せず処理を行いたいという要件があるなら、抽象クラスやインターフェースを用意してあげればいいかと思います。
振る舞いがどうあるべきか、でどちらを選択するかは変わります。
状況に応じて、インターフェースと抽象クラスを組み合わせることも可能です。
(インターフェースはいくつも実装可能、継承は1クラスのみ可能)

抽象クラスの場合
===========================
Public MustInherit Class TestClassBase
Private _Word As String

Public Property Word As String
Get
Return _Word
End Get
Set(value As String)
_Word = value
End Set
End Property

Public Sub New()
_Word = "aaa"
End Sub
End Class

Public Class TestClass1
Inherits TestClassBase

Public Sub New()
MyBase.New()
End Sub
End Class

Public Class TestClass1Ex
Inherits TestClassBase

Private _Text As String

Public Property Sample As String
Get
Return _Text
End Get
Set(value As String)
_Text = value
End Set
End Property

Public Sub New()
MyBase.New()
End Sub
End Class
===========================

インターフェースの場合
===========================
Public Interface ITestClass
Property Word As String
End Interface

Public Class TestClass1
Implements ITestClass

Private _Word As String

Public Property Word As String Implements ITestClass.Word
Get
Return _Word
End Get
Set(value As String)
_Word = value
End Set
End Property

Public Sub New()
_Word = "aaa"
End Sub
End Class

Public Class TestClass1Ex
Implements ITestClass

Private _Word As String

Public Property Word As String Implements ITestClass.Word
Get
Return _Word
End Get
Set(value As String)
_Word = value
End Set
End Property

Private _Text As String

Public Property Sample As String
Get
Return _Text
End Get
Set(value As String)
_Text = value
End Set
End Property

Public Sub New()
_Word = "aaa"
End Sub
End Class
===========================
    • good
    • 0
この回答へのお礼

naktak様

丁寧にご説明いただきありがとうございます。
クラスの継承でうまく対応できそうです。
サイプルを提示していただき、本当に助かりました。

また、インタフェースや中小クラスの説明もありがとうございます。
このあたりはうまく理解できていない箇所もありますので
勉強させていただきます。

ありがとうございます。

お礼日時:2020/11/26 13:29

ANo.1のお礼に記されている


<System.ComponentModel.Browsable(False)>

は、プロパティをコードする過程において表示されるか、しないかではありません。

コントロール/コンポーネントをデザイン上で編集している際に、
プロパティウィンドウで編集可能なプロパティとして表示されるかどうかです。
これを行った時、デザイナのプロパティウィンドウでは該当プロパティは表示されなくなりますが、コードする時はインテリセンスの候補として操作することができます。

今回のようなコントロール/コンポーネントではないただのクラスの場合には全く意味を成しません。


同じように、メソッドやプロパティに
<System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)>
という属性を付与することもできます。
これは、別なプロジェクトから、上記コードが含まれるプロジェクトの、コンパイルされたアセンブリ(DLLなど)を参照している時、コード上では、インテリセンスの候補として表示されなくなります。
しかし、これは表示されなくなるだけであって、そのメソッド/プロパティを利用することは可能です。
使っても害はないが、特に意識してコードする必要のないメソッド/プロパティをインテリセンスから隠す目的などに利用されます。


どちらも、あなたが望むタイミングで都度表示/非表示を切り替えられるようなものではなく、用途も異なり、あなたが望む動作のものではありません。
    • good
    • 0
この回答へのお礼

naktak様

No,2につづき
丁寧にご説明いただきありがとうございます。

<System.ComponentModel.Browsable(False)>
<System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)>

上記に関しては、別システムで使用していたため
挙動を勘違いしていました。
大変勉強になりました。

ありがとうございます。

お礼日時:2020/11/26 13:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!