<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 原則30:選擇重載而不是事件處理器 **By D.S.Qiu** **尊重他人的勞動,支持原創,轉載請注明出處:[http://dsqiu.iteye.com](http://dsqiu.iteye.com)** 很多 .NET 類提供兩種方式處理系統事件。你可以附加指定一個事件處理器或者重載基類的虛函數。為什么提供兩種方式做同一件事情?因為不同的情況需要不同的解決方案,這就是為什么。在子類中,你總可以重載虛函數。這樣不相關對象就不能使用這個事件處理器。你可以寫的一個漂亮的 Windows Presentation Foundation (WPF) 應用,需要響應鼠標按下事件。在你的 Form 類中,你可以選擇重載 OnMouseDown 方法: ``` public partial class Window1 : Window { // other code elided public Window1() { InitializeComponent(); } protected override void OnMouseDown(MouseButtonEventArgs e) { DoMouseThings(e); base.OnMouseDown(e); } } ``` 或者,你也可以指定一個事件處理器(需要 C# 和 XAML ): ``` <!-- XAML File --> <Window x:Class="Item36_OverridesAndEvent.Window1" xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" MouseDown="OnMouseDown"> <Grid> </Grid> </Window> // C Sharp file: public partial class Window1 : Window { // other code elided public Window1() { InitializeComponent(); } private void OnMouseDown(object sender,MouseButtonEventArgs e) { DoMouseThings(e); } private void DoMouseThings(MouseButtonEventArgs e) { throw new NotImplementedException(); } } ``` 第一個方案是更好的。WPF 程序中聲明代碼是重點這得可能令人驚訝。即使這樣,如果邏輯代碼需要用代碼實現,你應該使用虛函數。如果一個事件處理器拋出異常了,在鏈中的其他處理器就不會被調用(查看原則24和25)。通過重載 protected 需函數,你的處理器就可以被先調用。基類的虛函數版本是負責處理協議特殊的事情。這意味著如果你想要事件處理器被調用(并且你總是這樣做的),你必須調用基類的虛函數。在一些少數的情況,你不想要默認的行為,你就不調用基類的版本這樣就沒有處理器被調用。你不能保證所有的事件處理器會被調用因為有些不正確的事件處理器會拋出異常,但是你可以保證你的子類行為是正確的。 使用重載比附加事件處理器更高效。你應該記得原則25講到的事件是一個多播委托。這就使得一個事件源會有多個觀察者。這個事件機制會占用處理器多點時間,因為他必須檢查事件是否有添加事件處理器。如果有,它必須遍歷整個調用隊列,而這個隊列可能包含了任意數量的目標函數。隊列的每個方法都會被調用。檢查是否有事件處理器并在運行時遍歷調用會比只調用一個虛函數話費更多時間。 如果這個還不夠,再查看下上面的兩個例子。哪個更清晰?重載一個虛函數只需要檢查一個函數并且如果維護這個表單只需要修改這個函數。事件機制有兩個地方需要維護:事件處理器函數和關聯事件的代碼。這兩個都會導致事件失敗。一個函數就很更簡單了。 好了,我已經給出了使用重載而不是事件處理器的所有理由。那 .NET 框架設計者確定有必要添加事件處理器么?當然有必要。除了我們,他們太忙以至于不會寫沒有人用的代碼。重載只是在子類使用。其他的類都必須使用事件機制。這意味這在 XAML 文件中定義聲明就可以使用事件處理器。在上面的例子中,你的設計者可能會有鼠標按下的事件的行為。設計者可以創建 XAML 聲明它們的行為。這些行為可以響應表單事件。你可以在代碼中重定義所有行為,但那會花更多時間處理一個事件。這只是將設計者的問題轉移給你。你清楚自己想要設計者為你處理設計工作。更好的方式是創建一個事件然后通過設計工具創建 XMAL 聲明。所以最后,你創建一個新的類并發送事件到表單類。這樣一開始就添加一個事件處理器到表單會更簡單。畢竟,這就是為什么 .NET 框架設計者要在表單添加事件。 事件機制的另外一個理由是事件是在運行時被鏈接的。使用事件會有個更大的靈活性。你可以根據程序的不同狀態鏈接不同的事件處理器。假設你在寫一個畫圖程序。根據程序的不同狀態,鼠標按下可能開始畫線,或者可能是選擇一個對象。當使用者切換模式,你可以切換事件處理器。不同的類,不同的事件處理器,事件的處理依賴于程序的狀態。 最后,使用事件,你可以在一個事件上掛多個事件處理器。再想象剛才的畫圖程序。你可能有多個事件處理器跟鼠標事件掛鉤。第一個是具體的行為。第二個是更新狀態欄或者更新不同命令的可用性。多個行為可以在同一個事件響應。 當你基類有一個函數處理一個事件,重載是更好的方法。這個更容易維護,s即使時間退役也更可能是正確的,并且更高效。保留事件處理器做其他用途。更傾向與重載基類的實現而不是附加事件處理器。 小結: 這個原則就是說 WPF 編程實現事件響應要選擇重載虛函數的方式,而不是事件模式! 歡迎各種不爽,各種噴,寫這個純屬個人愛好,秉持”分享“之德! 有關本書的其他章節翻譯請[點擊查看](/category/297763),轉載請注明出處,尊重原創! 如果您對D.S.Qiu有任何建議或意見可以在文章后面評論,或者發郵件(gd.s.qiu@gmail.com)交流,您的鼓勵和支持是我前進的動力,希望能有更多更好的分享。 轉載請在**文首**注明出處:[http://dsqiu.iteye.com/blog/2087024](/blog/2087024) 更多精彩請關注D.S.Qiu的博客和微博(ID:靜水逐風)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看