@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

クラスの配列プロパティが宣言方法により、エラーとなる

投稿者投稿内容
みけ
会議室デビュー日: 2005/08/16
投稿数: 8
投稿日時: 2005-08-29 13:50
お世話になります。クラスの配列プロパティが、クラスの宣言方法によって
エラーとなり、悩んでおります。どうかご教授をお願いします。

クラス内容
Public Class cls
Private clsA As String() '内部変数宣言
'コンストラクタ処理
Sub New()
ReDim clsA(0) '変数初期化
End Sub
'プロパティの宣言
Public Property clsAP() As String()
Get
Return clsA
End Get
Set(ByVal Value As String())
clsA = Value
End Set
End Property
end Class

クラス使用プログラム(クラスはDLLで使用)
OKパターン
Dim objcls As New cls
ReDim objcls.clsAP(10) ←問題なく動作します

NGパターン
Dim objcls As Object
objcls = New cls
ReDim objcls.clsAP(10) ←エラーが発生します
エラー内容
型'Object()'から型'String()'へのキャストが有効ではありません。

理由があり、どうしてもNGパターンの宣言を行うのですが、
いろいろ調べましたが、結果を出すことができませんでした。
宜しくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-29 13:58
引用:

Dim objcls As Object
objcls = New cls
ReDim objcls.clsAP(10) ←エラーが発生します
エラー内容
型'Object()'から型'String()'へのキャストが有効ではありません。

理由があり、どうしてもNGパターンの宣言を行うのですが、
いろいろ調べましたが、結果を出すことができませんでした。


毎回、cls の方にキャストしないといけないですね。

# コンストラクタでいきなり ReDim で 0 の要素を確保ですか...



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-08-29 14:02
お世話になります。

ReDim CType(objcls, cls).clsAP(10)
ではダメですか?

# じゃんぬさんとかぶってしまいました…

[ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-08-29 14:03 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-29 14:04
あるいは
コード:

Dim news(10) As String
objcls.clsAP = news

とか。

//うがー、レイトバインディングとかReDimとか気持ち悪いー。型つけろー、オブジェクトはnewさせろー。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-08-29 14:09
配列の要素数が動的なら
Stringの配列ではなくStringCollectionを使ったほうがよいのではないでしょうか?
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-08-29 14:23
引用:

ReDim objcls.clsAP(10) ←エラーが発生します



object型で宣言しているために型情報が欠損しています。
キャストしてあげる必要があります。

ReDim CType(objcls2,cls).clsAP(10)

Visual Basic 言語リファレンス
CType 関数
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vafctCType.asp?frame=true

引用:

キャストが有効ではありません。


というエラーメッセージがでていますから、
「VB.NET キャスト」
というキーワードで検索するといいですよ。


ところでこの設計ですがちょっとまずいです。
外部から、クラス内にあるリソースの生成をさせるのはよろしくありません。
依存関係が強くなるからです。
クラスは再利用が期待されてしまいます。依存関係が強いと原因の切り離しがしにくくなります。他のコードからこのクラスを使うときにもトラブルになりやすくなります。

_________________
たつごろー
codeseek
こみゅぷらす
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-08-29 14:59
さて

> ReDim clsA(0) '変数初期化

配列の要素数はいくつでしょう?
# あっと、今回の問題とは全然関係ないです。
みけ
会議室デビュー日: 2005/08/16
投稿数: 8
投稿日時: 2005-08-29 15:02
皆さん、ありがとうございました。
CType関数で、テストを行い無事に動くようになりました。

>配列の要素数が動的なら
>Stringの配列ではなくStringCollectionを使ったほうがよいのではないでしょうか?

burton999さん、ご助言ありがとうございます。StringBuilderでしょうか?
現行のPGMでは、修正が難しいので次回のVerUpに再検討します。

>外部から、クラス内にあるリソースの生成をさせるのはよろしくありません。
>依存関係が強くなるからです。
>クラスは再利用が期待されてしまいます。依存関係が強いと原因の切り離しがしにくくなります。
>他のコードからこのクラスを使うときにもトラブルになりやすくなります。

たつごろーさん、設計のご助言いただきありがとうございます。
もう少し、よいクラスを設計して向上するようにします。


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