- PR -

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

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

R・田中一郎さんの書き込み (2006-01-26 18:54) より:

dim 性別 as integer = CType(view.CurrentCell.Value, ComboItem).id

本来、上記のように書くのを

dim 性別 as integer = CType(view.CurrentCell.Value, Integer)

このように書いてもOKとすることは、可能なものでしょうか。


やめましょう... CLR の主役である "型" が非常にわかりにくくなります。

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

じゃんぬねっとさんの書き込み (2006-01-26 19:34) より:

引用:

R・田中一郎さんの書き込み (2006-01-26 18:54) より:

dim 性別 as integer = CType(view.CurrentCell.Value, ComboItem).id

本来、上記のように書くのを

dim 性別 as integer = CType(view.CurrentCell.Value, Integer)

このように書いてもOKとすることは、可能なものでしょうか。


やめましょう... CLR の主役である "型" が非常にわかりにくくなります。



確かにわかりにくくはあるのですが、例えば次のような場合に、どのように書くのがスマートなのか、目指すところが見えなくなっている部分があるのです。

コード:

Public Sub New()
    表.Columns.Add(番号列の生成())
    表.Columns.Add(名称列の生成()) 
    表.Columns.Add(性別列の生成())
End Sub

Private Function 番号列の生成() as DataGridViewColumn
    dim 列 as DataGridViewColumn = New DataGridTextBoxColumn
    With 列
        .Name = "番号"
        .HeaderText = .Name
        .Width = 50
        :
        :
    End With
    Return (_列)
End Function

Private Function 名称列の生成() as DataGridViewColumn
    dim 列 as DataGridViewColumn = New DataGridTextBoxColumn
    With 列
        .Name = "名称"
        :
    End With
    Return (_列)
End Function

Private Function 性別() as DataGridViewColumn
    dim 列 as DataGridViewColumn = New DataGridComboBoxColumn
    With 列
	.CellTemplate = New CustomComboBoxCell
	.Name = "性別"
	.HeaderText = .Name
	.Items.Add(New ComboItem(1, "法人"))
	.Items.Add(New ComboItem(2, "男性"))
	.Items.Add(New ComboItem(3, "女性"))
	.Width = 90
    End With
    Return (_列)
End Function

Private Sub Me_値が変更される直前( _
 ByVal sender As Object, _
 ByVal e As 表コントロール.編集.取消せる編集セル _
) Handles MyBase.値が変更される直前
    e.取消し = (Not データを更新する(表.Columns(e.桁位置).Name, e.値))
End Sub

private sub データを更新する(byval 項目名 as string, byval 値 as object)
    ここで悩んでいるのです・・・
end sub



値はオブジェクトで、通常は、値を書き換えるためのクエリーを書くためには、

CType(値, String)

で済ませたいのですが、ComboItem の場合は、これができないのです。
どう書くのがスマートだと思いますか?
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-01-26 22:16
斜め読みなんで外してるかもしれませんが…

普通にキャストして,求める値の入ったプロパティで
アクセスするのが一番スマートだと思います。
何より読んでてわかりやすい。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2006-01-26 22:57
こんにちは

引用:

R・田中一郎さんの書き込み (2006-01-26 20:11) より:

値はオブジェクトで、通常は、値を書き換えるためのクエリーを書くためには、

CType(値, String)

で済ませたいのですが、ComboItem の場合は、これができないのです。
どう書くのがスマートだと思いますか?




ComboItemの派生クラスを作って、デフォルトプロパティを準備すれば



だけで済むような気がします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-26 23:08
> 、私のクラスを他の型にキャストさせる処理を自分の手で書きたかったのです。
TypeConverter or IConvertible って、書いているんだけどなぁ。。。


> どのように書くのがスマートなのか、
やめましょう、そんな考え方。スマートさより、堅牢さ、保守性に重きを置くべきです。

 たとえば、むか〜〜し、VB よりも前の BASIC のころ、こんな書き方をしていました。

p = p + (STICK & 1 == 1) * 32 - (STICK & 2 == 2)
- (STICK & 4 == 4) * 32 + (STICK & 8 == 8)

 STICK は、カーソルキーが押されているかを表し、上右下左の順に、1,2,4,8とします。画面座標を左上からの直線で考え、横が32あるとして、カーソルキーが押された状態によって座標を移動させています。1行だし、演算だけなので処理速度も上がります。X,Y 2つの変数を持ち、IF 文で条件分岐させていた私は、動きをトレースして、「なるほど〜」とうなりました。

 でも、「真」が−1であることに依存した、とても危ないプログラムです。画面を仮想的にスクロールさせることも出来ません(直すところが多くなる)。見た目やスピードと引き替えに、堅牢さと保守性を犠牲にしています。


> 1行に縮められる魔法の言葉だと思っているのですが
保守性を下げる、魔法の言葉です :P

 たとえば、「番号」に負の数が入ってくることは、想定していませんよね?でも、誰かが入れるかもしれない。Int32 の範囲を超えるような値をセットしようとするかもしれない。名前にも、常識的な長さの最大値があると思います。それを越えた設定が出来てしまいます。
 データを入力するのは、フォームからの手入力だけとは限りません。初期データを入れるときや、移行データを作るとき、ちょっとしたミスをすることは十分考えられます。そういうとき、このままでは、不正な値も入力できてしまいます。
 それを防ぐために、フィールドを private にして隠し、プロパティというメソッド経由でアクセスさせます。値の範囲チェックをするのはアクセスメソッドの中にまとめることが出来、チェックのためのコードをプログラム中にばらまかなくてすみます。
 ちなみに、チェックは必ずしてください。それがセキュアプログラミングの一歩です。つまりこれも、スマートさより、堅牢性、保守性を優先する、ということです。

 で、私が「ちゃうやん」といったのは、「プロパティちゃうやん、フィールドやん」です。コメントの間違いはバグと同じです。

〆 witten by Jitta on 2006/01/26

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-01-26 23:08 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-27 07:25
引用:

ジブさんの書き込み (2006-01-26 22:57) より:

ComboItemの派生クラスを作って、デフォルトプロパティを準備すれば



だけで済むような気がします。


パラメータのない、デフォルト プロパティは使えません。
いわゆるインデクサのことを仰っているのであれば、添え字が必要ですよね。

# ところで、15 が華麗にスルーされてますが、何かまずかったですかね? (^-^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-27 09:50
じゃんぬねっとさんの書き込み (2006-01-27 07:25) より:

# ところで、15 が華麗にスルーされてますが、何かまずかったですかね? (^-^
[/quote]

華麗にスルーしたつもりは無かったんです。
いつもながら、読んでいて「なるほど〜」と深く納得して、その後、何やら、いろいろなことで混乱していて、この件について返答するのが遅くなってしまったのです。
すみませんでした。

引用:

じゃんぬねっとさんの書き込み (2006-01-26 19:32) より:

考え方として正しいかどうかで言えば、そのクラスでの役割次第でしょう。
今回の例はインスタンス メンバなので「間違っている」に意見が傾きそうです。



引用:

Jittaさんの書き込み (2006-01-26 23:08) より:

> 1行に縮められる魔法の言葉だと思っているのですが

保守性を下げる、魔法の言葉です



という事は、特に番号の値チェックなどの副作用的なものが不要であっても、

コード:

    Public 番号 as string



ではなくて、

コード:

    Private _番号 As Integer 

    Public Property 番号() As Integer 
    Get 
        Return(_番号) 
    End Get 

    Set(Byval value As Integer) 
        _番号 = value 
    End Set 
    End Property 



と書くべきだということですね?
了解しました。今後、そう書くことにします。

#というか、今まで書いたのも全部なおしちゃった。

引用:

Jittaさんの書き込み (2006-01-26 23:08) より:

 で、私が「ちゃうやん」といったのは、「プロパティちゃうやん、フィールドやん」です。コメントの間違いはバグと同じです。



これは分かっていてわざと「プロパティ」と表現しました。
この頃の僕は、Public 番号 as string な書き方がアリだったので、分かっていてあえてプロパティ的な使い方をする際に、#Region で閉じた時に、プロパティとしての使われ方をするためでした。

でも、今の僕は、Public 番号 as string と書かないので、上記の書き方ももうしません。
いろいろとありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-27 10:20
Jitta さんのと合わせて引用するならば、こっちの方が適切かも。

引用:

プロパティを実装することで、間に副作用を挟む余地が生まれるというのも利点でしょう。
たとえば、バインディング、コントロールで言えば視覚変化などですね。


「たとえば」のところに、値チェックのこと書いた方が判りやすかったなぁ、と後悔です。

引用:

という事は、特に番号の値チェックなどの副作用的なものが不要であっても、


誤解を招かれそうなので補足しますが、
今回のような公開されたメンバの場合はです。
いつもそうであるべきと言う意味ではないです。

静的な読み取り専用のフィールドや、静的な定数フィールドであれば普通に使います。
私個人の意見としては「概念上」の問題が最もウェイトを占めています..

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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