明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP.NET可交互式位圖窗體設(shè)計(jì)(2)

[摘要]我們的任務(wù)   這個(gè)程序的基本思想如下:我們有一個(gè) abstract 基類(在 Microsoft Visual Basic? 中是 MustInherit),其中包含公共數(shù)據(jù)(如邊框)和一套虛擬方法,虛擬方法多數(shù)是抽象的(在 Visual Basic 中是 MustOverride),例如 Dr...
我們的任務(wù)
  這個(gè)程序的基本思想如下:我們有一個(gè) abstract 基類(在 Microsoft Visual Basic? 中是 MustInherit),其中包含公共數(shù)據(jù)(如邊框)和一套虛擬方法,虛擬方法多數(shù)是抽象的(在 Visual Basic 中是 MustOverride),例如 Draw。請(qǐng)注意,Draw 的多態(tài)性很重要,因?yàn)槊總(gè)可繪制對(duì)象類型(如點(diǎn)、線、矩形、圓等)都是用完全不同的代碼繪制的。 
  
  雖然方法可以是多態(tài)的,但數(shù)據(jù)不能。因此,我們只將確實(shí)應(yīng)用于所有可能的可繪制對(duì)象的數(shù)據(jù)放在程序中 -- 在本例中,放置了一個(gè)邊框和顏色(在其中繪制對(duì)象的線)。 
  
  與特定類型的可繪制對(duì)象相關(guān)的數(shù)據(jù)(例如圓的中心和半徑、矩形相對(duì)點(diǎn)的坐標(biāo),或者一條線的端點(diǎn))都應(yīng)該在與該類型的可繪制對(duì)象對(duì)應(yīng)的特定類(從抽象基類中派生)中聲明。請(qǐng)注意,可以使用二次派生合并相似的對(duì)象。例如,可以從橢圓中派生出圓,因?yàn)樗械膱A都是橢圓。與此類似,也可以從矩形中派生出方形,因?yàn)樗械姆叫味际蔷匦危ㄒ捕际撬倪呅、多邊形)。所選擇的派生樹(shù)會(huì)反映類之間的關(guān)系,以及常用的預(yù)期使用模式,這樣您經(jīng)常執(zhí)行的操作便會(huì)非常快速、方便。 
     
  因?yàn)闃?gòu)造函數(shù)(在 Visual Basic 中為 New)存在的主要原因是用于初始化數(shù)據(jù),因此構(gòu)造函數(shù)不是(實(shí)際上也不能是)多態(tài)的。這意味著初始創(chuàng)建操作不能是多態(tài)的,因?yàn)閿?shù)據(jù)要求隨類型的不同而不同。但是,一個(gè)好的設(shè)計(jì)在對(duì)象創(chuàng)建后,可在之后的使用中將對(duì)象作為多態(tài)處理,這里我們就是這樣做的。 
  
  讓我們看看這個(gè)類集中包含什么,從根抽象基類開(kāi)始: 
  
  抽象 (MustInherit) 基類
  以下是 C# 中抽象基類的代碼。單擊此處在新窗口中查看全部源文件。
  
  
  
    C#
  
  public abstract class DShape {
  public abstract void Draw(Graphics g);
  protected Rectangle bounding;
  protected Color penColor; // 還應(yīng)具有屬性
  // 還應(yīng)具有移動(dòng)、調(diào)整大小等方法。
  }
  
    以下是等同的 Visual Basic .NET 代碼。單擊此處在新窗口中查看全部源文件。
  
    Visual Basic .NET
  
  Public MustInherit Class DShape
  Public MustOverride Sub Draw(ByVal g As Graphics)
  Protected bounding As Rectangle
  Protected penColor As Color ' 還應(yīng)具有屬性
  ' 還應(yīng)具有移動(dòng)、調(diào)整大小等方法。
  End Class 
  
  語(yǔ)法雖然不同,但很明顯這是相同的類。 
  
  請(qǐng)注意,Draw 方法被暗示為 virtual (Overridable),因?yàn)樗宦暶鳛?abstract (MustOverride)。還要注意在這個(gè)類中我們并沒(méi)有提供一個(gè)實(shí)現(xiàn)。因?yàn)槲覀兩胁恢涝谶@個(gè)類中執(zhí)行的對(duì)象,因此不可能寫出繪圖代碼。 
  
  包含哪些數(shù)據(jù)?
  另請(qǐng)注意,這里并沒(méi)有很多數(shù)據(jù) -- 但我們已經(jīng)為這樣一個(gè)抽象類聲明了所有數(shù)據(jù)。 
  
  每一個(gè)可繪制對(duì)象(無(wú)論其形狀如何)都有一個(gè)邊框 -- 即可以完全包含該對(duì)象的最小可能矩形。邊框用于繪制點(diǎn)(作為很小的矩形)、長(zhǎng)方形和圓 -- 并且對(duì)于其他形狀,可以作為第一個(gè)用于點(diǎn)擊或碰撞測(cè)試的快速估計(jì)。 
  
  適用于所有對(duì)象的其他共同點(diǎn)并沒(méi)有很多;中心對(duì)于某些對(duì)象有用,例如圓和長(zhǎng)方形,對(duì)于其他對(duì)象(如三角形)則沒(méi)有意義。并且通常都是使用角來(lái)表示矩形,而不是使用中心。但您不能使用角來(lái)指定圓,因?yàn)閳A沒(méi)有角。Dr. GUI 確信您已經(jīng)看到了為一個(gè)普通可繪制對(duì)象指定其他數(shù)據(jù)的困難之處。 
  
  每個(gè)可繪制對(duì)象還有一個(gè)與繪制它的線相關(guān)聯(lián)的顏色,這里我們也做了聲明。 
  
  某些派生類
  如上所述,我們不能真正創(chuàng)建一個(gè)抽象基類類型的對(duì)象,雖然我們可以將從抽象基類(或任何基類)中派生的任何對(duì)象作為基類對(duì)象處理。 
   
   所以,為創(chuàng)建一個(gè)繪圖對(duì)象,我們必須從抽象基類中派生一個(gè)新類 -- 并確保覆蓋所有 abstract/MustOverride 方法。
  
    在本例中我們將使用 DHollowCircle 類。DHollowRectangle 類和 DPoint 類非常相似。
  
    以下是 C# 中的 DHollowCircle。單擊此處在新窗口中查看其他類。
  
  
    C#
  public class DHollowCircle : DShape
  {
  public DHollowCircle(Point p, int radius, Color penColor) {
  p.Offset(-radius, -radius); // 需要轉(zhuǎn)換到左上角
  int diameter = radius * 2;
  bounding = new Rectangle(p, new Size(diameter, diameter));
  this.penColor = penColor;
  }
  
  public override void Draw(Graphics g) {
  using (Pen p = new Pen(penColor)) {
  g.DrawEllipse(p, bounding);
  }
  }
  }
  
  
  以下是等同的 Visual Basic .NET 類。單擊此處在新窗口中查看其他類。
  
  
  Visual Basic .NET
  Public Class DHollowCircle
  Inherits DShape
  
  Public Sub New(ByVal p As Point, ByVal radius As Integer, _
  ByVal penColor As Color)
  p.Offset(-radius, -radius) ' 需要轉(zhuǎn)換到左上角
  Dim diameter As Integer = radius * 2
  bounding = New Rectangle(p, New Size(diameter, diameter))
  Me.penColor = penColor
  End Sub
  
  Public Overrides Sub Draw(ByVal g As Graphics)
  Dim p = New Pen(penColor)
  Try
  g.DrawEllipse(p, bounding)
  Finally
  p.Dispose()
  End Try
  End Sub
  End Class 
   
  
  請(qǐng)注意,我們沒(méi)有為這個(gè)類聲明其他數(shù)據(jù) -- 它給出的邊框和筆已經(jīng)足夠了。(對(duì)于點(diǎn)和矩形是這樣,但對(duì)于三角形和其他多邊形就不夠了。)我們的應(yīng)用程序不需要在設(shè)置圓后知道圓的中心或半徑,因此將它們忽略掉。(如果需要中心和半徑,我們可以存儲(chǔ)這些數(shù)據(jù),或者根據(jù)邊框計(jì)算得出。) 
  
  但我們確實(shí)需要邊框,因?yàn)樗怯糜诶L制圓的 Graphics.DrawEllipse 方法的一個(gè)參數(shù)。因此我們根據(jù)在構(gòu)造函數(shù)中傳遞的中心點(diǎn)和半徑計(jì)算邊框。 
  
  下面我們深入了解每一個(gè)方法。