| ■No34563 (tamaboyo さん) に返信 >>> 継承先にもLB_Clickがあるため、継承先は継承先で宣言が必要かと思っていました。 >>そもそも、継承元の LB_Click は継承先に見せる必要はないのですから、 >>private にしておけば十分だと思いますよ。 >>protected にするのは、OnLbClicked メソッドの方です。 > 継承元と継承先に同じ名前の関数があり、どちらもラベルのクリックイベントで発生する場合で > virtualとoverrideを利用する場合は、protectedではないのでしょうか?
継承元に protected な LB_Click メソッドがあった場合、 継承先で LB_Click メソッドを実装すると競合するため、 オーバーライド(override)かシャドウイング(new)かを選択せねばなりません。
しかし、継承元の実装が private void LB_Click(…) であるならば、 継承先で LB_Click メソッドを実装しても競合しません。何故なら継承先には、 継承元の private メンバの存在は見えないからです。
> この場合、継承元のLB_Clickのイベントはどうなるのでしょうか?
外から見えないだけであって、private メンバも内部には存在していますので、 処理は問題なく行われます。
もしも、Label.Click から LB_Click が呼び出されない仕様なのだとしたら、 同様に、Form.Load から Form1_Load も呼び出されない事になってしまいますが、 実際には、Load の処理なども行われていますよね。
>>そこで、個々のラベルに対してイベントを割り当てていくのでは無く、 >>複数のラベルからのイベントを一つに集約した独自イベントを作成し、継承先が >> this.LbClicked += Form1_LbClicked; >>とするだけで、たとえば >>のようにして利用できるように設計した方が使い勝手がよいであろう……という話です。 > > それぞれのラベルがクリックされた判別はできるのでしょうか?
継承先フォームのイメージコードとして、先ほど、
>> private void Form1_LbClicked(object sender, LbClickedEventArgs e) >> { >> Label label = e.Label; >> }
というサンプルを書きましたよね。この変数 label が、クリックされたラベルを表しています。
> #どういうコードを書けば良いかがまだわからないので、
継承元フォーム側の実装は、たとえばこうかな。
private void LB_Click(object sender, EventArgs e) { // クリックされたラベルを取得。 Label label = (Label)sender;
// // 必要があれば、ここに任意の処理を記述。 //
// LbClicked イベントを発生させるために用意した // protected メソッドを呼び出す。 OnLbClicked(new LbClickedEventArgs(label)); }
public event LbClickedEventHandler LbClicked;
protected void OnLbClicked(LbClickedEventArgs e) { if (LbClicked != null) LbClicked(this, e); }
public delegate void LbClickedEventHandler(object sender, LbClickedEventArgs e); public class LbClickedEventArgs : EventArgs { private Label label; public Label Labels { get { return label; } } public LbClickedEventArgs(Label label) { this.label = label; } } |