ASP.NET多态示例 抽象基类及派生类

开发 后端
本文介绍了ASP.NET多态,以及.NET抽象基类和派生类。通过这些可以实现在web 页上使用自定义绘制的位图。

在本文,我们将通过一个灵活的绘图应用程序提供一个有关继承、absspanact (mustinherit) 基类和接口的更为完整的示例。这不是一个控制台应用程序;由于其图形化的特征,更适合作为一个 microsoft windows 窗体应用程序。(这就给了我们一个了解 windows 窗体的机会。)

该 asp.net 版本将演示如何在 web 页上使用自定义绘制的位图 -- 这在大多数 web 编程系统中是非常难以实现的,但使用 asp.net 则很简单。dr. gui 相信您会喜欢这一点。而且您还可以运行该应用程序。

经典的ASP.NET多态示例

在教授编程时,有一些常用的、非常标准的示例程序。而我最初曾发誓不使用这些示例:我不会使用一个字符串类作为示例,也不会使用复杂的数字或绘图应用程序。毕竟,这样做就不是原创了。

然而随着事情的发展,使用这些示例显得很有必要(不仅仅是因为懒惰):这些示例非常丰富,易于解释和理解,并且可以非常清晰地揭示核心概念。

以下是该程序 windows 窗体版本的屏幕快照:

图 1:经典多态示例的 windows 窗体版本

 [[4805]]

以下是 asp.net 版本在浏览器中的显示:

图 2:经典多态示例的 asp.net 版本:ASP.NET多态

  经典多态示例的 asp.net 版本

这个程序的基本思想如下:我们有一个 absspanact 基类(在 microsoft visual basic? 中是 mustinherit),其中包含公共数据(如边框)和一套虚拟方法,虚拟方法多数是抽象的(在 visual basic 中是 mustoverride),例如 draw。请注意,draw 的多态性很重要,因为每个可绘制对象类型(如点、线、矩形、圆等)都是用完全不同的代码绘制的。

虽然方法可以是多态的,但数据不能。因此,我们只将确实应用于所有可能的可绘制对象的数据放在程序中 -- 在本例中,放置了一个边框和颜色(在其中绘制对象的线)。

与特定类型的可绘制对象相关的数据(例如圆的中心和半径、矩形相对点的坐标,或者一条线的端点)都应该在与该类型的可绘制对象对应的特定类(从抽象基类中派生)中声明。请注意,可以使用二次派生合并相似的对象。例如,可以从椭圆中派生出圆,因为所有的圆都是椭圆。与此类似,也可以从矩形中派生出方形,因为所有的方形都是矩形(也都是四边形、多边形)。所选择的派生树会反映类之间的关系,以及常用的预期使用模式,这样您经常执行的操作便会非常快速、方便。

因为构造函数(在 visual basic 中为 new)存在的主要原因是用于初始化数据,因此构造函数不是(实际上也不能是)多态的。这意味着初始创建操作不能是多态的,因为数据要求随类型的不同而不同。但是,一个好的设计在对象创建后,可在之后的使用中将对象作为多态处理,这里我们就是这样做的。

让我们看看这个类集中包含什么,从根抽象基类开始:

抽象 (mustinherit) 基类

以下是 c# 中抽象基类的代码。

c#

  1. public absspanact class dshape {   
  2. public absspanact void draw(graphics g);   
  3. protected rectangle bounding;   
  4. protected color pencolor; // 还应具有属性   
  5. // 还应具有移动、调整大小等方法。   

以下是等同的 visual basic .net 代码。

visual basic .net

  1. public mustinherit class dshape   
  2. public mustoverride sub draw(byval g as graphics)   
  3. protected bounding as rectangle   
  4. protected pencolor as color ' 还应具有属性   
  5. ' 还应具有移动、调整大小等方法。   
  6. end class  

语法虽然不同,但很明显这是相同的类。

请注意,draw 方法被暗示为 virtual (overridable),因为它被声明为 absspanact (mustoverride)。还要注意在这个类中我们并没有提供一个实现。因为我们尚不知道在这个类中执行的对象,因此不可能写出绘图代码。

包含哪些数据?

另请注意,这里并没有很多数据 -- 但我们已经为这样一个抽象类声明了所有数据。

每一个可绘制对象(无论其形状如何)都有一个边框 -- 即可以完全包含该对象的最小可能矩形。边框用于绘制点(作为很小的矩形)、长方形和圆 -- 并且对于其他形状,可以作为***个用于点击或碰撞测试的快速估计。

适用于所有对象的其他共同点并没有很多;中心对于某些对象有用,例如圆和长方形,对于其他对象(如三角形)则没有意义。并且通常都是使用角来表示矩形,而不是使用中心。但您不能使用角来指定圆,因为圆没有角。dr. gui 确信您已经看到了为一个普通可绘制对象指定其他数据的困难之处。

每个可绘制对象还有一个与绘制它的线相关联的颜色,这里我们也做了声明。

某些派生类

如上所述,我们不能真正创建一个抽象基类类型的对象,虽然我们可以将从抽象基类(或任何基类)中派生的任何对象作为基类对象处理。

所以,为创建一个绘图对象,我们必须从抽象基类中派生一个新类 -- 并确保覆盖所有 absspanact/mustoverride 方法。

在本例中我们将使用 dhollowcircle 类。dhollowrectangle 类和 dpoint 类非常相似。

以下是 c# 中的 dhollowcircle。

c#

  1. public class dhollowcircle : dshape   
  2. {   
  3. public dhollowcircle(point p, int radius, color pencolor) {   
  4. p.offset(-radius, -radius); // 需要转换到左上角   
  5. int diameter = radius * 2;   
  6. bounding = new rectangle(p, new size(diameter, diameter));   
  7. this.pencolor = pencolor;   
  8. }   
  9.  
  10. public override void draw(graphics g) {   
  11. using (pen p = new pen(pencolor)) {   
  12. g.drawellipse(p, bounding);   
  13. }   
  14. }   
  15. }   

以下是等同的 visual basic .net 类。

visual basic .net

  1. public class dhollowcircle   
  2. inherits dshape   
  3.  
  4. public sub new(byval p as point, byval radius as integer, _   
  5. byval pencolor as color)   
  6. p.offset(-radius, -radius) ' 需要转换到左上角   
  7. dim diameter as integer = radius * 2   
  8. bounding = new rectangle(p, new size(diameter, diameter))   
  9. me.pencolor = pencolor   
  10. end sub   
  11.  
  12. public overrides sub draw(byval g as graphics)   
  13. dim p = new pen(pencolor)   
  14. try   
  15. g.drawellipse(p, bounding)   
  16. finally   
  17. p.dispose()   
  18. end try   
  19. end sub   
  20. end class   

请注意,我们没有为这个类声明其他数据 -- 它给出的边框和笔已经足够了。(对于点和矩形是这样,但对于三角形和其他多边形就不够了。)我们的应用程序不需要在设置圆后知道圆的中心或半径,因此将它们忽略掉。(如果需要中心和半径,我们可以存储这些数据,或者根据边框计算得出。)

但我们确实需要边框,因为它是用于绘制圆的 graphics.drawellipse 方法的一个参数。因此我们根据在构造函数中传递的中心点和半径计算边框。

ASP.NET多态、抽象基类以及派生类就介绍到这里。

【编辑推荐】

  1. 浅谈ASP.NET XML Web服务
  2. ASP.NET的DataList和Repeater控件
  3. 浅析ASP.NET的IIS映射
  4. 概述ASP.NET状态类型
  5. 浅谈ASP.NET和Web服务器
责任编辑:yangsai 来源: blogbus
相关推荐

2009-08-04 17:42:23

DataSourceCASP.NET

2009-07-22 18:08:00

ASP.NET基类

2011-06-01 10:19:41

基类对象派生类对象

2009-07-29 13:57:53

创建SlideShowASP.NET

2009-08-07 15:40:10

CompositeCo复合控件

2009-08-05 18:17:16

ASP.NET控件开发基类

2009-07-24 12:41:21

BLL类

2009-07-29 13:12:36

StringBuildASP.NET技巧

2009-07-31 10:34:41

ASP.NET抓取网页

2009-08-07 16:09:25

ASP.NET AJA

2009-08-07 16:45:09

ASP.NET页面对象

2009-08-14 15:42:11

什么是.NET接口.NET抽象类

2021-10-17 18:54:40

Python定义使用

2009-08-07 16:27:59

ASP.NET AJA

2009-08-10 17:04:42

ASP.NET安装部署

2009-08-05 18:32:28

HtmlTextWriASP.NET控件开发

2009-09-04 11:15:07

选择C#构造函数

2009-07-31 16:51:59

ASP.NET数据库驱

2009-07-22 17:45:35

ASP.NET教程

2009-08-03 14:22:33

什么是ASP.NET
点赞
收藏

51CTO技术栈公众号