首页 > 编程 > .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 
  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表