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