C# OOP技術(shù) 對象之間的關(guān)系
繼承是對象之間的一種簡單關(guān)系,可以讓派生類完整地獲得基類的特性,而且派生類也可以訪問基類內(nèi)部的一些工作代碼(通過受保護(hù)的成員)。對象之間還具有其他一些重要關(guān)系。
簡要討論下述關(guān)系:
?包含關(guān)系:一個(gè)類包含另一個(gè)類。這類似于繼承關(guān)系,但包含類可以控制對被包含類的成員的訪問,甚至在使用被包含類的成員前進(jìn)行其他處理。
?集合關(guān)系:一個(gè)類用作另一個(gè)類的多個(gè)實(shí)例的容器。這類似于對象數(shù)組,但集合具有其他功能,包括索引、排序和重新設(shè)置大小等。
1.包含關(guān)系
用一個(gè)成員字段包含對象實(shí)例,就可以實(shí)現(xiàn)包含(containment)關(guān)系。這個(gè)成員字段可以是公共字段,此時(shí)與繼承關(guān)系一樣,容器對象的用戶可以訪問它的方法和屬性,但不能像繼承關(guān)系那樣,通過派生類訪問類的內(nèi)部代碼。
另外,可讓被包含的成員對象變成私有成員。如果這么做,用戶就不能直接訪問任何成員,即使這些成員是公共的。但可以使用包含類的成員訪問這些私有成員。也就是說,可以完全控制被包含的類對外提供什么成員(或者不提供任何成員),還可在訪問被包含類的成員前,在包含類的成員上執(zhí)行其他處理。
例如,Cow類包含一個(gè)Udder類,Udder類有一個(gè)公共方法MilkO。Cow對象可以按照要求調(diào)用這個(gè)方法,作為其SupplyMilkO方法的一部分,但Cow對象的用戶看不到這些細(xì)節(jié),或者這些細(xì)節(jié)對Cow對象的用戶并不重要。
在UML中,被包含類可用關(guān)聯(lián)線條來表示。對于簡單包含關(guān)系,可以用帶有1的線條說明一對一的關(guān)系(一個(gè)Cow實(shí)例包含一個(gè)Udder實(shí)例)。為清晰起見,也可以把被包含的Udder類實(shí)例表示為Cow類的私有字段,如圖所示。
2.集合關(guān)系
如何使用數(shù)組存儲多個(gè)同類型的變量,這也適用于對象(前面使用的變量類型實(shí)際上是對象)。例如:
Animal[] animals = new Animal[5];
集合基本上就是一個(gè)增加了功能的數(shù)組。集合以與其他對象相同的方式實(shí)現(xiàn)為類。它們通常以所存儲的對象名稱的復(fù)數(shù)形式來命名,例如用類Animals包含Animal對象的一個(gè)集合。
數(shù)組與集合的主要區(qū)別是,集合通常實(shí)現(xiàn)額外的功能,例如Add()和RemoveO方法可添加和刪除集合中的項(xiàng)。而且集合通常有一個(gè)ltem屬性,它根據(jù)對象的索引返回該對象。通常,這個(gè)屬性還允許實(shí)現(xiàn)更復(fù)雜的訪問方式。例如,可以設(shè)計(jì)一個(gè)Animals,讓Animal對象根據(jù)其名稱來訪問。
其UML表示如圖所示。圖中沒有包含成員,因?yàn)檫@里描述的是關(guān)系。連接線末尾的數(shù)字表示一個(gè)Animals對象可以包含0個(gè)或多個(gè)Animal對象。
點(diǎn)擊加載更多評論>>