- PR -

クラスの継承で特定のイベントを非公開にしたいんです

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-18 17:27
最近、覚えたての「クラスの継承」をさるのように使いまくっています。
そして、先ほど、基本クラスのイベントの中で、公開したくないものが出てきました。

公開させたくないイベント(場合によってはプロパティやメソッドなど)があった時、これを故意に見せないようにすることはできるんでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-18 17:40
引用:

R・田中一郎さんの書き込み (2005-12-18 17:27) より:

最近、覚えたての「クラスの継承」をさるのように使いまくっています。


業務にも因りますが、ほどほどにしましょう。(^^;)
単一継承とはいえ、継承しなければならない場面は意外と少ないものです。
(大きな Framework はこの限りでないです)

引用:

そして、先ほど、基本クラスのイベントの中で、公開したくないものが出てきました。
公開させたくないイベント(場合によってはプロパティやメソッドなど)があった時、これを故意に見せないようにすることはできるんでしょうか?


見せなくするだけなら private です。

イベント ハンドラのことを仰っているのであれば、おかしいです。
基本クラスのイベントは定義であって、実装は派生クラス側になりますよね。

# そういう意味ではないですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-18 18:47
じゃんぬねっとさん、いつもありがとうございます。
日曜日なのにお仕事されてるんですね。大変です。

引用:


じゃんぬねっとさんの書き込み (2005-12-18 17:40) より:

見せなくするだけなら private です。



先ほど、試しに private で書いてみたのですが、何故か見えていました。
根本的に、僕は何か勘違いしているのだと思われます。

引用:


じゃんぬねっとさんの書き込み (2005-12-18 17:40) より:

イベント ハンドラのことを仰っているのであれば、おかしいです。
基本クラスのイベントは定義であって、実装は派生クラス側になりますよね。

# そういう意味ではないですか?



すみません。この辺りも怪しいのです。
多分、イベントハンドラの受け取り方も間違っている気がします。

以下のクラスの場合、表コントロールクラスを使ったWindows のフォームは、System.Windows.Forms.DataGridView と同じプロパティ・メソッドが使えて、同じイベントも捕まえられます(よね?)←この辺りが、うろたえている現れ

コード:

Public Class 表コントロールクラス
    Inherits System.Windows.Forms.DataGridView
End Class



ここでやりたいこととして、

1.「値が変更された」という名前のイベントを作りたい。
2.「値が変更された」イベントは、基本クラスの「CellEndEdit イベント」を貰って、処理した結果で発行させたい。
3.表コントロールを使っているフォームには、直接 CellEndEdit イベントを使われたくないので見せたくない。

コード:

Public Class 表コントロールクラス
    Inherits System.Windows.Forms.DataGridView

    public event 値が変更された()
    
    '!!!! ここで見せなくしているつもり !!!!
    Private Shadows Event CellEndEdit( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
    )

    '!!!! ここで、基本クラスから CellEndEdit イベントを貰っているつもり !!!
    Private Sub 表コントロールクラス_CellEndEdit( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
    ) Handles Me.CellEndEdit
        if (値が変更されている(e)) then
            RaiseEvent 値が変更された()
        end if
    End Sub    
End Class



こんな風にしてみたのです。
しかし、表コントロールを使っているフォームからは CellEndEdit イベントは捕まえられてしまうし、CellEndEditイベントは表コントロールの中で捕まえられません。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-12-18 22:05
引用:

コード:
    '!!!! ここで、基本クラスから CellEndEdit イベントを貰っているつもり !!!
    Private Sub 表コントロールクラス_CellEndEdit( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
    ) Handles Me.CellEndEdit
    End Sub





 VB.NETはようわからんけど、こうかな:
Handles Me.CellEndEdit

Handles MyBase.CellEndEdit

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vakeyMyBase.asp
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-12-18 22:13
引用:

3.表コントロールを使っているフォームには、直接 CellEndEdit イベントを使われたくないので見せたくない。


 こっちは知らん。パス。
ていうかDataGridViewて2005か。いいなあ…。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2005-12-18 22:15
 おお。20件で「常連さん」か。気づかんかった。

[ メッセージ編集済み 編集者: lalupin4 編集日時 2005-12-18 22:17 ]
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-12-19 10:31
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17197&forum=7&start=16
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-12-19 10:44
引用:

todoさんの書き込み (2005-12-19 10:31) より:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17197&forum=7&start=16



VB.NET でどう書くか知りませんが、new で上書きしても駄目でしたっけ?>継承元の public メンバを隠蔽

# 基底クラスにキャストされたら見えちゃいますが、それはそんなもんつーことで。

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