質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

1125閲覧

クラス内の特定のプロパティを動的にReadonlyにできるでしょうか。

Arsnova

総合スコア8

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2022/11/29 00:52

編集2022/11/29 01:31

実現したいこと

自作したクラス内の特定のプロパティを動的にReadonlyにしたいのですが可能でしょうか。

該当のソースコード

【クラス側】

VBNET

1 Public Class FixStr 2 Private _pValue As String 3 Public Property pValue As String 4 Get 5 Return Me._pValue 6 End Get 7 Set(value As String) 8 '■何らかの処理 9 End Set 10 End Property 11 End Class 12 13 Public Class stRecord 14 Public ReadOnly Property 項目_読み取り専用 As New FixStr 15 Public Property 項目_書き込みOK As New FixStr 16 17 Public Sub New() 18 _項目_読み取り専用.pValue = "固定値" 19 End Sub 20 End Class

【利用者側】

VBNET

1 Private Sub クラス利用() 2 Dim rec As New stRecord 3 rec.項目_読み取り専用.pValue = "aaaa" ’★←ここでエラーになるようにしたいです。 4 rec.項目_書き込みOK.pValue = "OK" ’←同じ型だが書き込みOKにしたいものもある 5 End Sub

解決したいこと

上記の「項目_読み取り専用」と「項目_書き込みOK」は同じFixStrですが、
「項目_読み取り専用」はコンストラクタで固定値をクラス側で設定し
プログラマには変更させないようにできないか、と考えております。

ですが、「項目_読み取り専用」にReadOnlyをつけてもpValueプロパティに値は
設定できてしまいます。

やりたいことのイメージとしてはFixStrをインスタンス化するときにReadOnlyを
付けたらpValueに値を設定するのは不可、ReadOnlyをつけなければ値設定可能、
というような使い方をしたいのですが、当然現時点でうまく行ってないのでこの
使い方はNGなのですが、このイメージに近い使い方を可能にするような方法を
アドバイスいただけますと幸いです。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017
.NETframework 4.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/11/29 01:10

書き込みができるよう作らないのが筋です。
Arsnova

2022/11/29 01:26

そうしたいと思っているのでここで質問をしています。
Zuishin

2022/11/29 01:33

不要な実行時エラーの可能性ができるので、そうしたいと思っているのが間違いだという話です。 後で書き込みたいときにはメソッド等を使うようにするのが良いでしょう。
Arsnova

2022/11/29 01:50

readonlyが効くようにできれば、実行前にエラーであることがわかるのでそうしたいのです。
Zuishin

2022/11/29 01:59

コンパイル時にわからないので悪手だという話ですが、それがなぜ悪手なのか理解できないのであれば、好きなときに例外を発生させればいいのでは?
Arsnova

2022/11/29 02:06

だからreadonlyが効けばコンパイル時に分かるでしょう。
maisumakun

2022/11/29 02:09

> だからreadonlyが効けばコンパイル時に分かるでしょう。 それは「動的」とは呼ばない、という話ではないでしょうか。
Arsnova

2022/11/29 02:12

動的というのは適切ではなかったですね。 あらかじめわかっているので。
Zuishin

2022/11/29 02:21

> FixStrをインスタンス化するときにReadOnlyを 付けたらpValueに値を設定するのは不可、ReadOnlyをつけなければ値設定可能、 というような使い方をしたいのですが、 これは構文の問題ではなくデータの問題なのでコンパイル時ではなく実行時に決まります。 コンパイル時に決めるには型を変えるしかなく、KOZ6.0 さんの方法がスマートです。
guest

回答3

0

ベストアンサー

読み取り専用のインターフェイスを被せてそれを公開するとか。

vb

1Public Interface IFixStrReadOnly 2 ReadOnly Property pValue As String 3End Interface 4 5Public Class FixStr 6 Implements IFixStrReadOnly 7 8 Private _pValue As String 9 Public Property pValue As String 10 Get 11 Return Me._pValue 12 End Get 13 Set(value As String) 14 '■何らかの処理 15 End Set 16 End Property 17 18 Private ReadOnly Property IFixStrReadOnly_pValue As String _ 19 Implements IFixStrReadOnly.pValue 20 Get 21 Return pValue 22 End Get 23 End Property 24End Class 25 26Public Class stRecord 27 28 Private _項目_読み取り専用 As New FixStr 29 Public ReadOnly Property 項目_読み取り専用 As IFixStrReadOnly 30 Get 31 Return _項目_読み取り専用 32 End Get 33 End Property 34 35 Public Property 項目_書き込みOK As New FixStr 36 37 Public Sub New() 38 _項目_読み取り専用.pValue = "固定値" 39 End Sub 40End Class

投稿2022/11/29 01:56

編集2022/11/29 02:19
KOZ6.0

総合スコア2628

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arsnova

2022/11/29 02:23

ご回答ありがとうございます! ご回答内容でイメージ通りの使い方ができます! ありがとうございました!
guest

0

VBNET

1Public Class FixStr 2 3 Public ReadOnly Property pValue As String 4 5 Public Sub New(value As String) 6 pValue = value 7 End Sub 8 9End Class 10 11Public Class stRecord 12 13 Public ReadOnly Property 項目_読み取り専用 As FixStr 14 Public Property 項目_書き込みOK As FixStr 15 16 Public Sub New() 17 _項目_読み取り専用 = New FixStr("固定値") 18 End Sub 19 20End Class 21 22 23 Private Sub クラス利用() 24 25 Dim rec As New stRecord 26 rec.項目_書き込みOK = New FixStr("新たにセット") 27 rec.項目_読み取り専用.pValue = "新たにセット" 'BC30526 プロパティは'ReadOnly'です。 とエラーになる 28 29 End Sub 30

こういうことでしょうか?

投稿2022/11/29 01:26

YAmaGNZ

総合スコア10266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arsnova

2022/11/29 01:44

ご回答ありがとうございます! 私の使い方のイメージとしては(そもそも不可能なのでは?と思い始めています)、 書き込みOKの項目はpValue="aaa"のように設定でき、読み取り専用項目は同じ書き方をすると YAmaGNZさんが書いてくださったように「BC30526 プロパティは'ReadOnly'です。」になるのが理想でした。 ですが、考え方の重要なヒントになりました。 ご回答ありがとうございました!
guest

0

FixStr側にbReadOnly as booleanを追加して、TrueならpValueのSet でInvalidOperandExceptionでも投げるとか、
FixStrのpValueをReadonly Propertyにして、FixStrのコンストラクタでしか書けなくするか。

投稿2022/11/29 01:13

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arsnova

2022/11/29 01:46

ご回答ありがとうございます。 確かにこの方法も良いかもしれません。 考え方の非常に重要なヒントになりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問