设为首页
加入收藏
联系我们
首页 基础教程 技术文档 实例分析 数 据 库 疑难杂症 ASP.NET 七夕许愿树 技术论坛
最新文章
  .NET上传图片加文字…
 在vs.net bate…
 C#中利用正则表达式实现…
 Visual C#的SQ…
 关于使用存储过程创建分页
 通用分页显示查询存储过程
 大数据量的分页
 什么是web.confi…
 ASP.NET 配置文件…
 对“三层结构”的深入理解…
 多个关键字的查询问题
 VB和C# 语法对比图 …
 C#基础全接触
 用C#压缩和修复Acce…
 C#中的类型相等与恒等(…
推荐文章
 关于C#中的REF和黓认…
 读书笔记c#高级编程 委…
 【算法】C#快速排序类
 Visual C#的SQ…
 C#中调用API
 Infragistics…
 C#接口转换
 C#读取设备信息
 用.net操作word
 C# MessageBo…
 Visual C#中的数…
 雅虎公司C#笔试题,看看…
 C#.NET使用NHib…
 .net学习之运算符重载…
 Visual C# 3.…
热门文章
 ADO.Net与ADO在…
 开发ASP.NET下的M…
 用C#+XMI技术进行U…
 什么是虚拟机?
 C#基础全接触
 C#中利用正则表达式实现…
 雅虎公司C#笔试题,看看…
 用Visual C# 2…
 C#学习第一天
 C#语言初级入门(1)
 VB和C# 语法对比图 …
 远程重启计算机(C#)
 什么是B/S三层?
 Visual C#的SQ…
 Visual C#常用函…
C#学习第八天
阅读正文 文字大小:增大 减小  文字行距:增大 减小   双击自动滚屏
本文由中国C#技术学习中心整理  如果你对本文有不明之处请到技术论坛讨论!

5.2.2 改写方法
面向对象设计的重要原则就是多态性.不要理会高深的理论,多态性意味着:当基类程序员已设计好用于改写的方法时,在派生类中,你就可以重定义( 改写 )基类的方法.基类程序员可以用virtual
   关键字设计方法:
virtual void CanBOverridden( )

当从基类派生时,所有你要做的就是在新方法中加入override关键字:
override void CanBOverridden( )
当改写一个基类的方法时,你必须明白,不能改变方法的访问属性——在这章的后面,你会学到更多关于访问修饰符的知识.
除了改写基类方法的事实外,还有另一个甚至更重要的改写特性.当把派生类强制转换成基类类型并接着调用虚拟方法时,被调用的是派生类的方法而不是基类的方法.
( ( BaseClass )DerivedClassInstance ).CanBOverridden( );
为了演示虚拟方法的概念,清单 5.4 显示如何创建一个三角形基类,它拥有一个可以被改写的成员方法(ComputeArea).
清单 5.4 改写一个基类的方法
1: using System;
2:
3: class Triangle
4:
{
    5:
    public virtual double ComputeArea( int a,
    int b,
    int c )
    6:
    {
        7: // Heronian
        formula
        8: double s = ( a + b + c ) / 2.0;
        9: double dArea =    Math.Sqrt( s*( s-a )*( s-b )*( s-c ) );
        10: return dArea;
        11:
    }
    12:
}
13:
14: class RightAngledTriangle:Triangle
15:
{
    16:
    public override
    double ComputeArea( int a,
    int b,
    int c )
    17:
    {
        18: double dArea =    a*b/2.0;
        19: return dArea;
        20:
    }
    21:
}
22:
23: class
TriangleTestApp
24:
{
    25:
    public static void Main( )
    26:
    {
        27:
        Triangle tri = new Triangle( );
        28: Console.WriteLine( tri.ComputeArea( 2, 5,
        6 ) );
        29:
        30: RightAngledTriangle rat = new RightAngledTriangle( );
        31:
        Console.WriteLine( rat.ComputeArea( 3, 4, 5 ) );
        32:
    }
    33:
}
基类Triangle定义了方法ComputeArea.它采用三个参数,返回一个double结果,且具有公共访问性.从Triangle类派生出的是RightAngledTriangle,它改写了ComputeArea
   方法,并实现了自旱拿婊扑愎?两个类都被实例化,且在命名为TriangleTestApp的应用类的Main( ) 方法中得到验证.
我漏了解释第14行:
class RightAngledTriangle :
Triangle
在类语句中冒号(:)表示RightAngledTriangle从类 Triangle派生.那就是你所必须要做的,以让C#知道你想把
Triangle当作RightAngledTriangle的基类.当仔细观察直角三角形的ComputeArea方法时,你会发现第3个参数并没有用于计算.但是,利用该参数就可以验证是否是“直角”.如清单5.5所示.
清单 5.5 调用基类实现
1: class RightAngledTriangle:Triangle
2:
{
    3:
    public
    override double ComputeArea( int a,
    int b,
    int c )
    4:
    {
        5: const double
        dEpsilon = 0.0001;
        6: double dArea = 0;
        7: if ( Math.Abs( ( a*a + b*b - c*c ) )
        > dEpsilon )
        8:
        {
            9: dArea = base.ComputeArea( a,b,c );
            10:
        }
        11:
        else
        12:
        {
            13: dArea = a*b/2.0;
            14:
        }
        15:
        16: return
        dArea;
        17:
    }
    18:
}
该检测简单地利用了毕达哥拉斯公式,对于直角三角形,检测结果必须为0.如果结果不为0,类就调用它基类的
ComputeArea来实现.


dArea = base.ComputeArea( a,b,c );
例子的要点为:通过显式地利用基类的资格检查,你就能轻而易举地调用基类实现改写方法.当你需要实现其在基类中的功能,而不愿意在改写方法中重复它时,这就非常有帮助.



本文由中国C#技术学习中心整理  如果你对本文有不明之处请到技术论坛讨论!

中国C#技术交流QQ群:6337034  10976424  9383681  35248582  35248645
版权所有:中国C#技术学习中心 Copyright © 20010-20012
建议浏览分辨率使用:1024*768分辨率
粤ICP备05002251号