- PR -

キャストを作ることはできますか?

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-24 10:15
キャストを作るという表現が良いかどうかはわかりません。
やりたいことは、自分が作ったクラスの型にキャストされた場合の処理を書きたいということです。
こんな感じです。

コード:

public class 私のクラス
  public 番号 as integer
  public 名称 as string

  public sub new(byval 番号初期値 as integer, byval 名称初期値 as string)
    番号 = 番号初期値
    名称 = 名称初期値
  end sub

  public overrides function ToString() as string
    return (ctype(番号, string) & ":" & 名称)
  end sub

end class



こんなクラスを使って

コード:
private sub R・田中一郎くんをクラス替えする()
  dim さくら組 as new 私のクラス(1, "R・田中一郎くん")
  dim クラス変え as string = ctype(さくら組, string)
  dim すみれ組 as 私のクラス = ctype(文字列, 私のクラス)
end sub



こんな風に扱えるようにすることはできるのでしょうか?
できるとしたら、クラス変えは文字列なので、どのように変換させるのか?、また文字列から、どのように変換するのか?、の手続きを書くことになるかと思うのですが。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-24 10:40
C# では可能です。VBでも2005からは可能なのかな?
「演算子のオーバーロード」等で調査すると良いかと。

ただ、型変換のオーバーロードはあまり無頓着に使用するのはよろしくないかと思われます。
理由は、わけがわからなくなるから。
素直に、ToString() なり、FromString() なりを用意する方が良いですね。
どっちにしろ、演算子のオーバーロードをサポートしていない言語のために、それらのメソッドを用意すべきですし。

_________________
囚人のジレンマな日々
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-24 11:23
引用:


囚人さんの書き込み (2006-01-24 10:40) より:
C# では可能です。VBでも2005からは可能なのかな?
「演算子のオーバーロード」等で調査すると良いかと。

ただ、型変換のオーバーロードはあまり無頓着に使用するのはよろしくないかと思われます。
理由は、わけがわからなくなるから。
素直に、ToString() なり、FromString() なりを用意する方が良いですね。
どっちにしろ、演算子のオーバーロードをサポートしていない言語のために、それらのメソッドを用意すべきですし。



ありがとうございました。おかげさまで解決しました。
以下、解決したサンプルを載せておきます。

コード:

public class 私のクラス

#region " コンストラクタ・デストラクタ "
    public sub new(byval 文字列 as string)
        me.FromString(文字列)    
    end sub

    public sub new(byval 番号初期値 as integer, byval 名称初期値 as string)
        番号 = 番号初期値
        名称 = 名称初期値
    end sub
#end region

#region " 番号 プロパティ "
    public 番号 as integer
#end region

#region " 名称 プロパティ "
    public 名称 as string
#end region

#region " ToString メソッド(Override) "
    public overrides function ToString() as string
        return (ctype(番号, string) & ":" & 名称)
    end sub
#end region

#region " FromString メソッド "
    public sub FromString(byval 文字列 as string)
        Dim A() As String = value.Split(":"c)
        番号 = CType(A(0), Integer)
        名称 = ""
        For i As Integer = 1 To A.Length - 1
            If (i > 1) Then
                名称 &= ":"
            End If
            名称 &= A(i)
        Next
    end sub
#end region

#region " CType(Operator) "
    Public Shared Widening Operator CType(ByVal value As 私のクラス) As String
        Return (value.ToString())
    End Operator

    Public Shared Widening Operator CType(ByVal value As String) As 私のクラス
        Return (New 私のクラス(value))
    End Operator
#end region

end class


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-24 11:42
演算子のオーバーロード使用時の考慮事項

VB は演算子も多いので色々と制約がありますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-24 14:45
引用:

じゃんぬねっとさんの書き込み (2006-01-24 11:42) より:
演算子のオーバーロード使用時の考慮事項

VB は演算子も多いので色々と制約がありますね。





そうですね。
というより今は、CType や + - の再定義がVBでできることの感動が先に来てます。

ちなみに先ほどのサンプルは、文字列に : を含まない場合を想定していないことが、つい先ほどわかりました。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-24 14:59
引用:

R・田中一郎さんの書き込み (2006-01-24 14:45) より:

そうですね。
というより今は、CType や + - の再定義がVBでできることの感動が先に来てます。


C# でもそうなのですが、使う場面ってあんまりないです。
直感で「演算子の効果 (期待どおり)」がわかるようなクラスがあまりないからです。
囚人さんも仰られているように、意味がわかる名前を付けられるメソッドの方がたいてい長けています。

究極的には、System.String クラスのようなクラスのみに適用したいですね。
私は自作した SqlCommandBuilder クラスにしか使ってません...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-01-24 15:15
<独り言>
またVB独自のキーワードが増えた……。>Narrowing/Widening
Implicit/Explicitでいいのに。
</独り言>
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-24 19:23
引用:

じゃんぬねっとさんの書き込み (2006-01-24 14:59) より:

C# でもそうなのですが、使う場面ってあんまりないです。
直感で「演算子の効果 (期待どおり)」がわかるようなクラスがあまりないからです。
囚人さんも仰られているように、意味がわかる名前を付けられるメソッドの方がたいてい長けています。



なるほど、確かにそうですね。
実のところ、僕もどんな時に使うのかを考えるにあたって、あまり思い浮かばなかったりします。

今回の場合は、DataGridView の DataGridViewComboBoxCulumn で使おうと思ったのです。
DataGridViewComboBoxCulumn.Items の Item には Object を格納できます。
ここに、番号・名称の組合せを格納したい場合、どのようにすれば良いか試行錯誤しております(現時点でも試行錯誤中です)

で、考えたのは、これらのメンバを持つ「私のクラス」を用意して、ここから生成したオブジェクトを Item に格納してみた訳です。
すると、選択肢にはオブジェクト名が表示されました。
そこで、「私のクラス」にToString() メソッドをオーバーライドしたところ、目的どおりに表示されたので気を良くしていたところ、入力後にキャストできない旨のエラーが表示されたわけです。

外部からキャストのテストをした結果は、きちんと動いたので、このスレ上では解決できたことになるのですが、実は本来の目的の DataGridViewComboBoxColumn で利用することは未だできていません。

どうすりゃいいのか、誰か知っている人がいたら教えて欲しいです。orz

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