15.4.1 表示绘图

728 篇文章 1 订阅
48 篇文章 0 订阅
 

15.4.1 表示绘图

 

    在第 2 章,我们用形状的概念来演示差别联合。对于绘图应用程序,这将是一个不错的选择,应用程序需要了解形状的结构。对于我们动画库,这不是特别灵活,所以,我们将使用更具扩展性的表示形式。在 C# 中,绘图将是一个接口,有一个方法绘制图形对象。它可以更简单地表示为一个函数,我们还想要隐藏其内部表示形式。

    F# 版本将按 C# 的风格,也使用接口。原因是,该代码使用了很多 .NET 的功能,使用接口比 F# 专有的类型,在标准 .NET 编程上更加一致。另一个原因是,它是我们练习使用 F# 对象类型的一个好机会。因为这些表示非常相似,我们可以把它们放在一起讨论。清单 15.12 显示了实现绘图的第一步。

 

Listing 15.12 Representing drawings in C# and F#

 

// C# version
using System.Drawing;

interface IDrawing {
  void Draw(Graphics gr);
}

class Drawing : IDrawing {
  private readonly Action<Graphics> f;
  public Drawing(Action<Graphics> f) {
    this.f = f;
  }
  public void Draw(Graphics gr) {
    DrawFunc(gr);
  }
}

// F# version
open System.Drawing

type Drawing =
  abstract Draw : Graphics –> unit

let drawing(f) =
  { new Drawing with
      member x.Draw(gr) = f(gr) }

 

    在两种语言中,虽然体系的理念是相同的,但是使用了不同的技术来实现。在 C# 和 F# 中,我们都首先定义接口。在 F# 中,我们没有说声明接口,编译器会推断出,因为这个类型只包含抽象成员。正如我们在第 9 章中提到的,可以忽略 F# 接口名的前缀 I,只要它仅用于 F# 时,因为 F# 统一了所有类型声明。

    下一步,我们需要决定如何创建绘图。它由绘图函数指定,因此,我们希望能够指定 lambda 函数。在 C# 中,我们创建一个简单的类,实现这个接口,并取 Action<Graphics> 类型的函数作为构造函数的参数。该参数表示绘图要求绘制本身时,将调用的函数。在 F# 中,每当需要创建绘图值时,可以使用对象表达式,但是,我们实现一个工具函数,来简化此任务。函数 drawing 取一个绘图函数,作为参数,并返回 drawing 值,将使用此函数。这使我们能够使用 lambda 函数,它的语法比对象表达式更简单。

    清单 15.12 显示了面向对象技术和函数的概念可以有效地结合起来使用。接口声明使用传统的面向对象的概念,因为,我们在这一章中讨论的示例已经是一个更为进化的应用程序。但是,为了实现,我们仍然可以使用简单的函数式的风格。我们会在下一节中看到,实现首次绘图的连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值