
いつもお世話になっております。
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は不要な時は非表示にしたいです。
どういう方法があるのか調べてみてもよくわかりません。
お手数をおかけしますが、よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
使う必要があるかないかは、クラスの設計によるでしょう。
必要がなくても、プロパティとして存在しており、それを利用すればクラスの設計として、そのプロパティの内容に応じて動作に多少の変化が起こる、というだけの話なら、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
===========================
naktak様
丁寧にご説明いただきありがとうございます。
クラスの継承でうまく対応できそうです。
サイプルを提示していただき、本当に助かりました。
また、インタフェースや中小クラスの説明もありがとうございます。
このあたりはうまく理解できていない箇所もありますので
勉強させていただきます。
ありがとうございます。
No.3
- 回答日時:
ANo.1のお礼に記されている
<System.ComponentModel.Browsable(False)>
は、プロパティをコードする過程において表示されるか、しないかではありません。
コントロール/コンポーネントをデザイン上で編集している際に、
プロパティウィンドウで編集可能なプロパティとして表示されるかどうかです。
これを行った時、デザイナのプロパティウィンドウでは該当プロパティは表示されなくなりますが、コードする時はインテリセンスの候補として操作することができます。
今回のようなコントロール/コンポーネントではないただのクラスの場合には全く意味を成しません。
同じように、メソッドやプロパティに
<System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)>
という属性を付与することもできます。
これは、別なプロジェクトから、上記コードが含まれるプロジェクトの、コンパイルされたアセンブリ(DLLなど)を参照している時、コード上では、インテリセンスの候補として表示されなくなります。
しかし、これは表示されなくなるだけであって、そのメソッド/プロパティを利用することは可能です。
使っても害はないが、特に意識してコードする必要のないメソッド/プロパティをインテリセンスから隠す目的などに利用されます。
どちらも、あなたが望むタイミングで都度表示/非表示を切り替えられるようなものではなく、用途も異なり、あなたが望む動作のものではありません。
naktak様
No,2につづき
丁寧にご説明いただきありがとうございます。
<System.ComponentModel.Browsable(False)>
<System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)>
上記に関しては、別システムで使用していたため
挙動を勘違いしていました。
大変勉強になりました。
ありがとうございます。
No.1
- 回答日時:
「表示」「非表示」とは、具体的にどこにどう「表示」されることなのですか?
普通は
・Sampleプロパティの有無でクラスを分ける
・無視する
ってあたりだと思います。
kmee様
ご回答ありがとうございます。
プロパティの上部に以下を付与すると非表示になることはわかるのですが
「<System.ComponentModel.Browsable(False)> _」
TestClass2のプロパティを用いて表示/非表示を切り替えられないかと思っています。
下記サイトを参考にしたのですが、私の理解が足らずにうまく動いていない現状です。。。
[PropertyウィンドウまたはPropertyGridの表示内容の動的変更]
https://social.msdn.microsoft.com/Forums/ja-J...
[プロパティの表示非表示の切り替えについて]
http://bbs.wankuma.com/index.cgi?mode=al2&...
>普通は
> ・Sampleプロパティの有無でクラスを分ける
> ・無視する
> ってあたりだと思います。
そうですね。
とりあえず無視する方向で、もう少し勉強致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB初心者なのでわかりづらい説...
-
Calendar型を使用して日付の差...
-
(vba)他のアプリケーションの右...
-
JAVAにFTP転送をサポートし...
-
【継承】親のメソッドの実行
-
ArrayListはListのデフォルト実...
-
ラベルに日付を表示
-
C# 「データが失なわれる可能性...
-
C#からDLLを呼びたいのですが・...
-
javaで
-
インターフェースは New 出来な...
-
C++ヘッダの肥大化
-
オブジェクト指向 ボールの衝突
-
vb.net 自作プロパティの削除に...
-
ゲッターを使わないで変数にア...
-
JavaのComparatorを使ったソート
-
compareToにおける「自然順序付...
-
private継承はどう使う?
-
中学生です。 私は教室の黒板に...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB DLLプロジェクトについて
-
(vba)他のアプリケーションの右...
-
【C#】クラスのコンストラクタ...
-
メソッドの引数にクラス名を渡す
-
C# 「データが失なわれる可能性...
-
C#からDLLを呼びたいのですが・...
-
「IOException は対応する try ...
-
c++でのヘッダーファイルの循環...
-
ファイルパスが取得出来ない(P...
-
「ラッパークラス」の存在意義...
-
抽象クラスをJUNITでテストする...
-
ASP.NETでの共通コードの書き方...
-
interface,extend,implementの...
-
「ひとつのインターフェースで...
-
javanoリストのオブジェクト作...
-
オーバーライドとラッパーの違い
-
System.Collections.Generic.Li...
-
VBがオブジェクト指向言語でな...
-
compareToにおける「自然順序付...
-
Commons-Discovery.jarとは?
おすすめ情報