第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

公開繼承的事件

公開繼承的事件

C#
慕蓋茨4494581 2022-12-04 10:42:48
我正在為這里的其他程序員編寫幾個 UserControl。一些與 base 同名的 Exposed EventHandlers 被接受(UserControl CodesCombo -> SelectedValueChanged)有些不是(UserControl TextBox -> TextChanged)我正在編寫一個包含文本框的用戶控件。我需要向此控件的潛在使用者公開 TextChanged 事件。我有一個基于 ComboBox 的類似控件,在其中我使用了public event EventHandler SelectedValueChanged     {    add { cbMain.SelectedValueChanged += value; }    remove { cbMain.SelectedValueChanged -= value; }    }         公開“Change”事件“SelectedValueChanged”,它可以正常工作,沒有任何問題。但是,當(dāng)我嘗試以類似的方式在基于 TextBox 的控件中使用此技術(shù)時public event EventHandler TextChanged    {    add { tbMain.TextChanged += value; }    remove { tbMain.TextChanged -= value; }    }我收到一條警告消息:'MyTextBox.TextChanged' hides inherited member 'UserControl.TextChanged'. Use new keyword if hiding was intentional.我不完全確定消息的含義,除了顯而易見的,但我所知道的是我不 - 認為 - 我想隱藏任何東西。我有內(nèi)部 SelectedValueChanged 和 TextChanged 函數(shù)(cbMain_SelectedValueChanged、tbMain_TextChanged),它們可以做一些我需要的事情,但我想允許消費者也獲得對文本更改的事件調(diào)用,就像它們在基于 ComboBox 中所做的那樣。此外,在測試程序的可用事件列表中,我根本沒有得到任何“更改”事件。我現(xiàn)在通過將事件公開為“TextChange”來解決這個問題new public event EventHandler TextChange    {    add { tbMain.TextChanged += value; }    remove { tbMain.TextChanged -= value; }    }這在列表中給了我一個事件并且似乎工作得很好,但我更愿意對此有一個通用的解決方案,因為我們正在為我們的包做更多的控制,我不認為我能得到遠離那些只是“關(guān)閉”的名字。知道這條消息真正告訴我什么,以及我如何在內(nèi)部獲得我的事件,同時仍然讓用戶獲得他們的事件?
查看完整描述

1 回答

?
慕萊塢森

TA貢獻1810條經(jīng)驗 獲得超4個贊

知道這條消息真正告訴我什么嗎?


首先,了解隱藏的含義。暫時忘記這是一個事件的事實。如果我們有:


class B     { public void M() { Console.WriteLine("B.M()"); } }

class D : B { public void M() { Console.WriteLine("D.M()"); } }

那么我們有兩個方法都稱為 M。如果你說:


D d = new D();

B b = d;

d.M(); // D.M();

b.M(); // B.M();

編譯器警告你有兩種方法,而不是一種,你得到哪一種取決于接收器的編譯時類型,而不是接收器的運行時類型。


為什么這可能不是你想要的?


三個原因。


首先,許多 C# 程序員是從 Java 轉(zhuǎn)到 C# 的,Java 中的方法會自動重寫。在 C# 中,方法必須virtual被覆蓋。編譯器告訴你,你沒有得到你可能期望的語義。


其次,這是為了緩解脆弱的基類問題。假設(shè) B 的作者給 D 團隊一個 DLL 程序集,其中包含 B 而沒有 M,D 從中派生,添加方法 DM 那么 B 團隊意識到他們可以實現(xiàn) M,所以他們將它添加到 B 并給 D 團隊一個新的部件?,F(xiàn)在應(yīng)該警告 D 團隊 BM 存在,以便他們可以決定是否刪除 DM。


第三,你為什么要這樣做?如果基類已經(jīng)有你想要的事件,就使用它吧!不要用舊的做新的;只用舊的。編譯器告訴你,你肯定在做一些奇怪而且可能是錯誤的事情。


如果您打算讓兩個成員位于兩個不同的類中,其中一個隱藏另一個,您可以通過放置new成員告訴編譯器“我已經(jīng)考慮過這個,這是故意的”。那就是“這是一個新成員,我的意思是讓它成為一個新成員,而不是覆蓋舊成員”。


查看完整回答
反對 回復(fù) 2022-12-04
  • 1 回答
  • 0 關(guān)注
  • 111 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號