国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 12:55:39
字體:
供稿:網(wǎng)友
我們的任務(wù)
    這個程序的基本思想如下:我們有一個 abstract 基類(在 microsoft visual basic? 中是 mustinherit),其中包含公共數(shù)據(jù)(如邊框)和一套虛擬方法,虛擬方法多數(shù)是抽象的(在 visual basic 中是 mustoverride),例如 draw。請注意,draw 的多態(tài)性很重要,因為每個可繪制對象類型(如點、線、矩形、圓等)都是用完全不同的代碼繪制的。
  
    雖然方法可以是多態(tài)的,但數(shù)據(jù)不能。因此,我們只將確實應(yīng)用于所有可能的可繪制對象的數(shù)據(jù)放在程序中 -- 在本例中,放置了一個邊框和顏色(在其中繪制對象的線)。
  
    與特定類型的可繪制對象相關(guān)的數(shù)據(jù)(例如圓的中心和半徑、矩形相對點的坐標(biāo),或者一條線的端點)都應(yīng)該在與該類型的可繪制對象對應(yīng)的特定類(從抽象基類中派生)中聲明。請注意,可以使用二次派生合并相似的對象。例如,可以從橢圓中派生出圓,因為所有的圓都是橢圓。與此類似,也可以從矩形中派生出方形,因為所有的方形都是矩形(也都是四邊形、多邊形)。所選擇的派生樹會反映類之間的關(guān)系,以及常用的預(yù)期使用模式,這樣您經(jīng)常執(zhí)行的操作便會非常快速、方便。
  
    以下是我們的類派生圖:
  
  
  
  圖 3:類派生圖
  
    因為構(gòu)造函數(shù)(在 visual basic 中為 new)存在的主要原因是用于初始化數(shù)據(jù),因此構(gòu)造函數(shù)不是(實際上也不能是)多態(tài)的。這意味著初始創(chuàng)建操作不能是多態(tài)的,因為數(shù)據(jù)要求隨類型的不同而不同。但是,一個好的設(shè)計在對象創(chuàng)建后,可在之后的使用中將對象作為多態(tài)處理,這里我們就是這樣做的。
  
    讓我們看看這個類集中包含什么,從根抽象基類開始:
  
    抽象 (mustinherit) 基類
    以下是 c# 中抽象基類的代碼。單擊此處在新窗口中查看全部源文件。
  
  
  
    c#
  
  public abstract class dshape {
  public abstract void draw(graphics g);
  protected rectangle bounding;
  protected color pencolor; // 還應(yīng)具有屬性
  // 還應(yī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)具有移動、調(diào)整大小等方法。
  end class
  
    語法雖然不同,但很明顯這是相同的類。
  
    請注意,draw 方法被暗示為 virtual (overridable),因為它被聲明為 abstract (mustoverride)。還要注意在這個類中我們并沒有提供一個實現(xiàn)。因為我們尚不知道在這個類中執(zhí)行的對象,因此不可能寫出繪圖代碼。
  
    包含哪些數(shù)據(jù)?
    另請注意,這里并沒有很多數(shù)據(jù) -- 但我們已經(jīng)為這樣一個抽象類聲明了所有數(shù)據(jù)。
  
    每一個可繪制對象(無論其形狀如何)都有一個邊框 -- 即可以完全包含該對象的最小可能矩形。邊框用于繪制點(作為很小的矩形)、長方形和圓 -- 并且對于其他形狀,可以作為第一個用于點擊或碰撞測試的快速估計。
  
    適用于所有對象的其他共同點并沒有很多;中心對于某些對象有用,例如圓和長方形,對于其他對象(如三角形)則沒有意義。并且通常都是使用角來表示矩形,而不是使用中心。但您不能使用角來指定圓,因為圓沒有角。dr. gui 確信您已經(jīng)看到了為一個普通可繪制對象指定其他數(shù)據(jù)的困難之處。
  
    每個可繪制對象還有一個與繪制它的線相關(guān)聯(lián)的顏色,這里我們也做了聲明。
  
    某些派生類
    如上所述,我們不能真正創(chuàng)建一個抽象基類類型的對象,雖然我們可以將從抽象基類(或任何基類)中派生的任何對象作為基類對象處理。
  
    所以,為創(chuàng)建一個繪圖對象,我們必須從抽象基類中派生一個新類 -- 并確保覆蓋所有 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
  
  
    請注意,我們沒有為這個類聲明其他數(shù)據(jù) -- 它給出的邊框和筆已經(jīng)足夠了。(對于點和矩形是這樣,但對于三角形和其他多邊形就不夠了。)我們的應(yīng)用程序不需要在設(shè)置圓后知道圓的中心或半徑,因此將它們忽略掉。(如果需要中心和半徑,我們可以存儲這些數(shù)據(jù),或者根據(jù)邊框計算得出。)
  
    但我們確實需要邊框,因為它是用于繪制圓的 graphics.drawellipse 方法的一個參數(shù)。因此我們根據(jù)在構(gòu)造函數(shù)中傳遞的中心點和半徑計算邊框。
  
    下面我們深入了解每一個方法。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠安县| 曲周县| 崇州市| 新竹县| 浑源县| 洪雅县| 九龙城区| 从江县| 和田市| 咸丰县| 互助| 土默特右旗| 岑巩县| 烟台市| 马山县| 勐海县| 额尔古纳市| 安阳县| 即墨市| 亳州市| 陆良县| 河间市| 克东县| 孟州市| 武义县| 康定县| 贡嘎县| 仁化县| 肥东县| 金川县| 闵行区| 云霄县| 通化县| 白银市| 长宁县| 临安市| 惠水县| 邢台市| 康定县| 镇雄县| 龙海市|