C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 継承とダウンキャスト


(過去ログ 74 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■43213 / inTopicNo.1)  継承とダウンキャスト
  
□投稿者/ ふくこ (1回)-(2009/11/02(Mon) 13:19:30)

分類:[設計/仕様] 

はじめまして。
VB.netで値の取得と表示のコードを定型化させたいと思っています。

親データ格納クラスに各画面で共通的につかう属性を定義しています。
親処理クラスでMustOverrideとして「GetData」「DispData」メソッドを定義しています。
GetDataメソッドでデータ格納クラスに値を設定し、Dispメソッドでデータ格納クラスに
設定した値を画面表示する処理の流れにしたいです。

このような構成を各画面で実装したいです。
子データ格納クラス(親データ格納クラスを継承)に各画面を表示する各項目を属性としてもたせ
子処理クラス(親処理クラスを継承)でそれを表示させたいです。

そして、現在困っておりますのは、データ格納クラスの「GetData」「DispData」メソッド間の
データ格納クラスの受け渡し方法です。
親処理クラスのDispDataメソッドの引数に親データ格納クラスを定義してしまうと
子処理クラスではGetDataメソッドで子データ格納クラスを生成、属性を設定し
DispDataメソッドに引数として渡しても、子処理クラスのGetDataメソッドでは
親データ格納クラスにアップキャストしてしまっています。

各子処理画面のDispDataメソッドで各子データ格納クラスにダウンキャストすればいいだけなのですが、
もうすこし上手いやり方はないでしょうか?

そもそもの意図としては、各画面で自由にコードを書かれるのが嫌だったので
1.データ取得メソッド(GetData)とデータ表示メソッド(DispData)で
画面表示を行うというのを決め事にしたい。

2.画面表示の内容の共通項目を親データ格納クラスとして定義し
各画面のデータ格納クラスはこれを継承したい。

上記2点を実現したく思っています。

ヒントだけでも何卒いただけないでしょうか。
お願いいたします。
引用返信 編集キー/
■43214 / inTopicNo.2)  Re[1]: 継承とダウンキャスト
□投稿者/ 囚人 (429回)-(2009/11/02(Mon) 13:35:51)
多分、簡単にコード書いた方がいいんじゃないですかね。
これでは、状況を把握できる人が少ないと思います。
引用返信 編集キー/
■43215 / inTopicNo.3)  Re[2]: 継承とダウンキャスト
□投稿者/ ふくこ (2回)-(2009/11/02(Mon) 14:05:40)
2009/11/02(Mon) 14:14:48 編集(投稿者)
2009/11/02(Mon) 14:13:49 編集(投稿者)
2009/11/02(Mon) 14:09:40 編集(投稿者)
2009/11/02(Mon) 14:09:34 編集(投稿者)

No43214 (囚人 さん) に返信
> 多分、簡単にコード書いた方がいいんじゃないですかね。
> これでは、状況を把握できる人が少ないと思います。

>囚人さん
アドバイスありがとうございます。
以下にコードを書きます。


'''親データ格納クラス
Public Class BaseData
    Private _formCaption Ass String = String.Empty
    ' 画面名(全画面共通の属性)
    Public Property FormCaption() As String
        Get
            Return _formCaption
        End Get
        Set(ByVal Value As String)
            _formCaption = Value
        End Set
    End Property
End Clase

'''親処理クラス
Public Class BaseProcess
    Public MustOverride Sub GetData()
    Public MustOverride Sub GetData(Byval data As BaseData)
End Class


上記のような構成を各画面で行いたいので


'''子データ格納クラス
Public Class SubAAAData Inherits BaseData
    Private _AAA Ass String = String.Empty
    ' 属性1(画面ごとの属性)
        Public Property AAA As String
        Get
            Return _AAA
        End Get
        Set(ByVal Value As String)
            _AAA = Value
        End Set
    End Property
End Clase

'''子処理クラス
Public Class SubAAAProcess Inherits BaseProcess
    Public Overrides Sub GetData()
        '子データ格納クラス 生成
        Dim dataAAA As New SubAAAData
        '子データ格納クラスに値設定
        dataAAA.AAA = "hoge"
        '画面表示
        GetData(dataAAA)
    End Sub

    Public Overrides Sub GetData(Byval data As BaseData)
        'ここで子データ格納クラスの属性を取得して、画面に設定したい。
        Dim aaa As String = data.AAA←しかし、この時点ではBaseDataにアップキャストされてるので取得できない
    End Sub
End Class


申し訳ありませんが、何卒よろしくお願いいたします。
引用返信 編集キー/
■43217 / inTopicNo.4)  Re[3]: 継承とダウンキャスト
□投稿者/ まさる (109回)-(2009/11/02(Mon) 14:22:13)
まさる さんの Web サイト
No43215 (ふくこ さん) に返信
ジェネリックを使ってみてはいかがでしょう?

'''親データ格納クラス
Public Class BaseData
  Private _formCaption As String = String.Empty
  ' 画面名(全画面共通の属性)
  Public Property FormCaption() As String
    Get
      Return _formCaption
    End Get
    Set(ByVal Value As String)
      _formCaption = Value
    End Set
  End Property
End Class

'''親処理クラス
Public MustInherit Class BaseProcess(Of TData As BaseData)  ' BaseDataの制約をつけた型パラメータTData
  Public MustOverride Sub GetData()
  Public MustOverride Sub GetData(ByVal data As TData)  ' TDataを引数とするメソッド
End Class

'''子データ格納クラス
Public Class SubAAAData
  Inherits BaseData
  Private _AAA As String = String.Empty
  ' 属性1(画面ごとの属性)
  Public Property AAA() As String
    Get
      Return _AAA
    End Get
    Set(ByVal Value As String)
      _AAA = Value
    End Set
  End Property
End Class

'''子処理クラス
Public Class SubAAAProcess
  Inherits BaseProcess(Of SubAAAData) ' BaseDataの派生型を型パラメータに指定したBaseProcessを継承
  Public Overrides Sub GetData()
    '子データ格納クラス 生成
    Dim dataAAA As New SubAAAData
    '子データ格納クラスに値設定
    dataAAA.AAA = "hoge"
    '画面表示
    GetData(dataAAA)
  End Sub

  Public Overrides Sub GetData(ByVal data As SubAAAData) ' 型が明示されたBaseProcessのメソッドをオーバーライド
    'ここで子データ格納クラスの属性を取得して、画面に設定したい。
    Dim aaa As String = data.AAA
  End Sub
End Class

引用返信 編集キー/
■43219 / inTopicNo.5)  Re[4]: 継承とダウンキャスト
□投稿者/ ふくこ (3回)-(2009/11/02(Mon) 14:49:45)
No43217 (まさる さん) に返信
> ■No43215 (ふくこ さん) に返信
> ジェネリックを使ってみてはいかがでしょう?

>まさるさん

なるほどぉぉぉ。
こんなふうにかけるのですね。
ジェネリックに関して、よく分からなかったので
具体的にソース書いていただいてすごいよくわかりました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -