在面向對象的世界裏,有很多屬性,比如Button,它定義了大約70-80個屬性來描述它的狀態。那麽屬性的缺點是什麽呢?
當然,所謂的缺點應該是具體到具體環境的。以Button為例,它的繼承樹是Button->;button base-& gt;內容控制-& gt;控制->;framework element-& gt;ui element-& gt;視覺-& gt;dependency object-& gt;…
每次繼承時,都會繼承父類的私有字段。當然,這種繼承很有意思,但是就Button而言,大部分屬性都沒有被修改,在定義父類時仍然保持默認值。通常,在壹個按鈕對象的整個生命周期中,只有少數屬性被修改,大多數屬性保持初始值。每個字段需要占用不同的內存,如4K。這裏,有壹個可以優化的地方:
由繼承引起的對象擴展。每次都繼承父類的字段,所以繼承樹的低端對象不可避免的膨脹。
大多數字段都沒有被修改,它們保留了構造時的默認值。能否將這些場從物體中分離出來,以減小物體的體積?
在上述背景下,依賴出現了,微軟設計了DependencyProperty類。裏面有什麽?公共?靜態DependencyProperty寄存器(字符串名稱,類型propertyType,類型ownerType,?Object defaultValue)方法註冊屬性。然後定義DependencyObject的基類來消費該屬性。這樣,從DenpendencyObject繼承的類可以註冊自己的依賴屬性,這些屬性是自己註冊的,但實際上嚴格來說並不是自己的,這樣就節省了空間。註冊的屬性通過哈希(?內部靜態字典& lt對象,DependencyProperty & gtRegisteredDps =新詞典& lt對象,DependencyProperty & gt())來維護。註冊的屬性都存儲在這個散列中。從此以後,依賴我的感覺的起源就變得清晰了,不是我自己的屬性,而是這個屬性依賴於DependencyProperty。
依賴關系解釋了,屬性呢?其實屬性只是壹個對外公開的接口。註冊了依賴屬性之後,就是給依賴屬性賦值(set)或者向依賴屬性要值(get)。這些操作封裝在DependencyObject類中,所用屬性的所有值都傳遞?列表& ltEffectiveValueEntry & gt_effectiveValues?=?新列表& ltEffectiveValueEntry & gt()存放和維護。這樣不會汙染原來的默認值。這裏實現了通過DependencyObject中的effectiveValues可以追蹤到某個屬性變化的過程,也支持動畫。獲取和分配都是通過輸入EffectiveValueEntry獲得的。在這壹點上,設計了依賴屬性。
仔細聽這個設計,但是我們想要求子類有自己的默認屬性。比如很多控件都有Name屬性,但是有時候我們不希望每個人的默認值都壹樣,但是* * *用的是同壹個DP。這怎麽解決?
為了支持不同的默認值,必須在內部維護壹個對應不同DependencyObject type的列表,可以根據傳入的DependencyObject類型讀取其對應的默認值。需要在DP中維護壹個自描述列表,根據微軟的命名規則添加新類型PropertyMetadata。事實上,私人名單
我對附加屬性的看法:說白了就是依賴屬性的轉換,只是封裝不壹樣。區別就在於加了兩個字。事實上,有些對象不具有某些屬性,而有些對象具有這些屬性,所以具有這些依賴屬性的對象可以將某些屬性附加到沒有這些屬性的對象上。比如,人沒有等級和階級的屬性,學校有等級和階級的屬性,但人在學校學習,就有階級和等級的屬性。這時,學校對象可以附加班級的屬性。這是附加屬性。
回想壹下依賴屬性。依賴屬性是針對壹個對象的,可以註冊依賴屬性,這個對象以後也會有這個屬性。附加屬性針對兩個對象,壹個是附加對象,另壹個是附加對象。是否可以理解為被附著對象給附著對象註冊了壹個依賴屬性?但是這個依賴屬性依賴於附加對象的操作。不知道我的理解對不對。