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

首頁 > 編程 > .NET > 正文

ASP.NET可交互式位圖窗體設計(4)

2024-07-10 12:55:38
字體:
來源:轉載
供稿:網友

 繪圖如何改變
    您會注意到,draw 方法與基類基本相同 -- 主要差別在于它調用了 fill 方法,因為要完成繪制一個填充對象,所以需要對其進行填充。我們沒有為繪制輪廓重寫代碼,而是再次調用了基類的方法:visual basic .net 中的 mybase.draw(g) 或 c# 中的 base.draw(g);。
  
    因為我們正在指派用于繪制輪廓的筆,因此需要使用 using 或 try/finally 和 dispose 以確保迅速釋放 windows 筆對象。(同樣,如果非常確信所調用的方法不會引發異常,可以在完成筆的處理后,跳過異常處理,而只調用 dispose。但我們必須調用 dispose,無論是直接調用,還是通過 using 語句。
  
    實現 fill 方法
    fill 方法很簡單:指派一個畫筆,然后在屏幕上填充對象 -- 并確保 dispose 畫筆。
  
    請注意,在 visual basic .net 中,您必須明確指定實現一個接口的方法 (... implements ifillable.fill);而在 c# 中,實現接口中的方法或屬性由方法或屬性的簽名確定(因為您編寫了一個稱為 fill 的方法,該方法不返回任何內容并接受一個 graphics,因此它必須是 ifillable.fill 的實現)。非常奇怪,dr. gui 通常喜歡簡潔的編程結構(如果不可能通過簡單的編寫完成),但實際上卻傾向使用 visual basic 的語法,因為這種語法既清晰又靈活(visual basic 實現類中的方法名稱不必與接口中的名稱匹配,并且一個給定方法通常能夠實現多個接口方法)。
  
    實現屬性
  
    ifillable 接口還包含一個屬性,從中可以 set 和 get 畫筆顏色。(我們在 change fills to hot pink [將填充色更改為粉紅] 按鈕處理程序中使用該屬性。)
  
    為實現公開屬性,我們需要一個私有或保護的字段。這里我們選擇了保護字段,以便能夠方便地從派生類(而不允許任何類)對其進行訪問。
  
    具有該字段后,我們可以輕松地編寫一個很簡單的 set 和 get 方法對以實現屬性。
  
    請再次注意,在 visual basic .net 中,必須明確指定所實現的屬性。
  
    接口還是抽象 (mustinherit) 基類?
  
    在面向對象的編程中,最常見的爭論之一就是,是使用抽象基類還是使用接口。
  
    接口可以提供一些額外的靈活性,但也要付出一定代價:對于實現該接口的每一個類,必須實現其中的所有內容。我們可以使用一個 helper 類來協助這項工作(稍后會提供一個相關示例),但您仍然必須在所有地方實現所有內容。并且接口不能包含數據(雖然如此,與在 brand j 的系統中不同,它們可以包含屬性,因此它們可以看起來好象包含了數據)。
  
    在本例中,dr. gui 為 dshape 選擇了使用一個抽象基類而不是一個接口,因為他不想在每個類中將數據作為屬性重復實現。此外,還因為從 dshape 派生出的所有內容都是形狀,由于可填充對象仍然是形狀,因而也可以進行填充。
  
    您的選擇可能有所不同,但 dr. gui 認為他在此做出的選擇非常正確。
  
    繪圖對象的容器
    因為要重復繪制我們的對象(在 windows 窗體版本中,每次都將繪制圖像;在 asp.net 版本中,每次都將重新加載 web 頁),因此需要將它們放在一個容器中,以便能夠反復訪問它們。
  
    dr. gui 更進一步,將容器變得智能化,使其知道如何繪制所包含的對象。以下是這個容器類的 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("沒有任何要繪制的內容;列表為空...",
  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("沒有任何要繪制的內容;列表為空...", _
  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 
  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梅州市| 江口县| 盐山县| 伽师县| 红河县| 南川市| 曲松县| 福安市| 西青区| 鹿邑县| 宜阳县| 从化市| 嵩明县| 凤庆县| 确山县| 雷州市| 东阿县| 广丰县| 彰化市| 冕宁县| 宝清县| 江门市| 临潭县| 宁波市| 平安县| 万安县| 北碚区| 澜沧| 大城县| 河南省| 大余县| 泰宁县| 长春市| 四子王旗| 宿迁市| 吉隆县| 弥渡县| 沾化县| 永兴县| 班戈县| 海阳市|