ASP.NET可交互式位圖窗體設(shè)計(jì)(4)
發(fā)表時(shí)間:2024-02-09 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]繪圖如何改變 您會(huì)注意到,Draw 方法與基類基本相同 -- 主要差別在于它調(diào)用了 Fill 方法,因?yàn)橐瓿衫L制一個(gè)填充對(duì)象,所以需要對(duì)其進(jìn)行填充。我們沒(méi)有為繪制輪廓重寫代碼,而是再次調(diào)用了基類的方法:Visual Basic .NET 中的 MyBase.Draw(g) 或 C# 中的...
繪圖如何改變
您會(huì)注意到,Draw 方法與基類基本相同 -- 主要差別在于它調(diào)用了 Fill 方法,因?yàn)橐瓿衫L制一個(gè)填充對(duì)象,所以需要對(duì)其進(jìn)行填充。我們沒(méi)有為繪制輪廓重寫代碼,而是再次調(diào)用了基類的方法:Visual Basic .NET 中的 MyBase.Draw(g) 或 C# 中的 base.Draw(g);。
因?yàn)槲覀冋谥概捎糜诶L制輪廓的筆,因此需要使用 using 或 Try/Finally 和 Dispose 以確保迅速釋放 Windows 筆對(duì)象。(同樣,如果非常確信所調(diào)用的方法不會(huì)引發(fā)異常,可以在完成筆的處理后,跳過(guò)異常處理,而只調(diào)用 Dispose。但我們必須調(diào)用 Dispose,無(wú)論是直接調(diào)用,還是通過(guò) using 語(yǔ)句。
實(shí)現(xiàn) Fill 方法
Fill 方法很簡(jiǎn)單:指派一個(gè)畫筆,然后在屏幕上填充對(duì)象 -- 并確保 Dispose 畫筆。
請(qǐng)注意,在 Visual Basic .NET 中,您必須明確指定實(shí)現(xiàn)一個(gè)接口的方法 (... Implements IFillable.Fill);而在 C# 中,實(shí)現(xiàn)接口中的方法或?qū)傩杂煞椒ɑ驅(qū)傩缘暮灻_定(因?yàn)槟帉懥艘粋(gè)稱為 Fill 的方法,該方法不返回任何內(nèi)容并接受一個(gè) Graphics,因此它必須是 IFillable.Fill 的實(shí)現(xiàn))。非常奇怪,Dr. GUI 通常喜歡簡(jiǎn)潔的編程結(jié)構(gòu)(如果不可能通過(guò)簡(jiǎn)單的編寫完成),但實(shí)際上卻傾向使用 Visual Basic 的語(yǔ)法,因?yàn)檫@種語(yǔ)法既清晰又靈活(Visual Basic 實(shí)現(xiàn)類中的方法名稱不必與接口中的名稱匹配,并且一個(gè)給定方法通常能夠?qū)崿F(xiàn)多個(gè)接口方法)。
實(shí)現(xiàn)屬性
IFillable 接口還包含一個(gè)屬性,從中可以 set 和 get 畫筆顏色。(我們?cè)?Change fills to hot pink [將填充色更改為粉紅] 按鈕處理程序中使用該屬性。)
為實(shí)現(xiàn)公開(kāi)屬性,我們需要一個(gè)私有或保護(hù)的字段。這里我們選擇了保護(hù)字段,以便能夠方便地從派生類(而不允許任何類)對(duì)其進(jìn)行訪問(wèn)。
具有該字段后,我們可以輕松地編寫一個(gè)很簡(jiǎn)單的 set 和 get 方法對(duì)以實(shí)現(xiàn)屬性。
請(qǐng)?jiān)俅巫⒁,?Visual Basic .NET 中,必須明確指定所實(shí)現(xiàn)的屬性。
接口還是抽象 (MustInherit) 基類?
在面向?qū)ο蟮木幊讨,最常?jiàn)的爭(zhēng)論之一就是,是使用抽象基類還是使用接口。
接口可以提供一些額外的靈活性,但也要付出一定代價(jià):對(duì)于實(shí)現(xiàn)該接口的每一個(gè)類,必須實(shí)現(xiàn)其中的所有內(nèi)容。我們可以使用一個(gè) helper 類來(lái)協(xié)助這項(xiàng)工作(稍后會(huì)提供一個(gè)相關(guān)示例),但您仍然必須在所有地方實(shí)現(xiàn)所有內(nèi)容。并且接口不能包含數(shù)據(jù)(雖然如此,與在 Brand J 的系統(tǒng)中不同,它們可以包含屬性,因此它們可以看起來(lái)好象包含了數(shù)據(jù))。
在本例中,Dr. GUI 為 DShape 選擇了使用一個(gè)抽象基類而不是一個(gè)接口,因?yàn)樗幌朐诿總(gè)類中將數(shù)據(jù)作為屬性重復(fù)實(shí)現(xiàn)。此外,還因?yàn)閺?DShape 派生出的所有內(nèi)容都是形狀,由于可填充對(duì)象仍然是形狀,因而也可以進(jìn)行填充。
您的選擇可能有所不同,但 Dr. GUI 認(rèn)為他在此做出的選擇非常正確。
繪圖對(duì)象的容器
因?yàn)橐貜?fù)繪制我們的對(duì)象(在 Windows 窗體版本中,每次都將繪制圖像;在 ASP.NET 版本中,每次都將重新加載 Web 頁(yè)),因此需要將它們放在一個(gè)容器中,以便能夠反復(fù)訪問(wèn)它們。
Dr. GUI 更進(jìn)一步,將容器變得智能化,使其知道如何繪制所包含的對(duì)象。以下是這個(gè)容器類的 C# 代碼:
C#
public class DShapeList {
ArrayList wholeList = new ArrayList();
ArrayList filledList = new ArrayList();
public void Add(DShape d) {
wholeList.Add(d);
if (d is IFillable)
filledList.Add(d);
}
public void DrawList(Graphics g) {
if (wholeList.Count == 0)
{
Font f = new Font("Arial", 10);
g.DrawString("沒(méi)有任何要繪制的內(nèi)容;列表為空...",
f, Brushes.Gray, 50, 50);
}
else
{
foreach (DShape d in wholeList)
d.Draw(g);
}
}
public IFillable[] GetFilledList() {
return (IFillable[])filledList.ToArray(typeof(IFillable));
}
}
以下為等同類的 Visual Basic .NET 代碼:
Visual Basic
.NET Public Class DShapeList
Dim wholeList As New ArrayList()
Dim filledList As New ArrayList()
Public Sub Add(ByVal d As DShape)
wholeList.Add(d)
If TypeOf d Is IFillable Then filledList.Add(d)
End Sub
Public Sub DrawList(ByVal g As Graphics)
If wholeList.Count = 0 Then
Dim f As New Font("Arial", 10)
g.DrawString("沒(méi)有任何要繪制的內(nèi)容;列表為空...", _
f, Brushes.Gray, 50, 50)
Else
Dim d As DShape
For Each d In wholeList
d.Draw(g)
Next
End If
End Sub
Public Function GetFilledList() As IFillable()
Return filledList.ToArray(GetType(IFillable))
End Function
End Class