ASP.NET可交互式位图窗体设计4

 绘图如何改变
  您会注意到,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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值