C#改写方法学习笔记

开发 后端
这里介绍C#改写方法,面向对象设计的重要原则就是多态性。不要理会高深的理论,多态性意味着:当基类程序员已设计好用于改写的方法时,在派生类中,你就可以重定义(改写)基类的方法。

C#改写方法

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

  1. virtual void CanBOverridden() 

当从基类派生时,所有你要做的就是在新方法中加入override关键字:

  1. override void CanBOverridden() 

当改写一个基类的方法时,你必须明白,不能改变方法的访问属性——在这章的后面,你会学到更多关于访问修饰符的知识。

除了改写基类方法的事实外,还有另一个甚至更重要的改写特性。当把派生类强制转换成基类类型并接着调用虚拟方法时,被调用的是派生类的方法而不是基类的方法。

  1. ((BaseClass)DerivedClassInstance)。CanBOverridden(); 

为了演示虚拟方法的概念,显示如何创建一个三角形基类,它拥有一个可以被改写的成员方法(ComputeArea)。

  1. using System;  
  2. class Triangle  
  3. {  
  4. public virtual double ComputeArea(int a, int b, int c)  
  5. {  
  6. // Heronian formula  
  7. double s = (a + b + c) / 2.0;  
  8. double dArea = Math.Sqrt(s*(s-a)*(s-b)*(s-c));  
  9. return dArea;  
  10. }  
  11. }  
  12. class RightAngledTriangle:Triangle  
  13. {  
  14. public override double ComputeArea(int a, int b, int c)  
  15. {  
  16. double dArea = a*b/2.0;  
  17. return dArea;  
  18. }  
  19. }  
  20. class TriangleTestApp  
  21. {  
  22. public static void Main()  
  23. {  
  24. Triangle tri = new Triangle();  
  25. Console.WriteLine(tri.ComputeArea(2, 5, 6));  
  26. RightAngledTriangle rat = new RightAngledTriangle();  
  27. Console.WriteLine(rat.ComputeArea(3, 4, 5));  
  28. }  

基类Triangle定义了方法ComputeArea.它采用三个参数,返回一个double结果,且具有公共访问性。从Triangle类派生出的是RightAngledTriangle,它改写了ComputeArea 方法,并实现了自己的面积计算公式。两个类都被实例化,且在命名为TriangleTestApp的应用类的Main() 方法中得到验证。

我漏了解释第14行:

class RightAngledTriangle : Triangle

在类语句中冒号(:)表示RightAngledTriangle从类 Triangle派生。那就是你所必须要做的,以让C#知道你想把Triangle当作RightAngledTriangle的基类。

当仔细观察直角三角形的ComputeArea方法时,你会发现第3个参数并没有用于计算。但是,利用该参数就可以验证是否是"直角"。

  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. return dArea;  
  16. }  

该检测简单地利用了毕达哥拉斯公式,对于直角三角形,检测结果必须为0.如果结果不为0,类就调用它基类的ComputeArea来实现。

dArea = base.ComputeArea(a,b,c);

例子的要点为:通过显式地利用基类的资格检查,你就能轻而易举地调用基类实现C#改写方法。当你需要实现其在基类中的功能,而不愿意在C#改写方法中重复它时,这就非常有帮助。

【编辑推荐】

  1. 介绍Mono C#编译器
  2. C#运算符重载学习总结
  3. 概述C#语言的结构体
  4. C#遗传算法学习笔记
  5. 讨论C#分部方法
责任编辑:佚名 来源: 51CTO.com
相关推荐

2009-08-31 16:51:11

C# Main()方法

2009-08-27 09:27:49

C#扩展方法

2009-08-21 18:01:32

C#匿名方法

2009-08-12 17:32:44

C#反射方法

2009-08-14 09:41:03

C#遗传算法

2009-08-20 15:02:57

C# If语句

2009-08-12 15:50:40

C# ListBox

2009-08-12 09:28:36

C# WiteOne

2009-08-13 18:21:52

C#学习笔记

2009-08-12 10:46:54

C#命名空间

2009-08-21 17:53:28

C#查询结果

2009-08-25 15:26:03

C#调用ImOK

2009-08-24 14:30:49

C# WMI封装

2009-08-31 15:27:33

C# TreeView

2009-08-24 15:46:46

C# SmartPho

2009-08-26 10:48:44

C# SQL命令

2009-12-03 09:59:34

2009-08-27 16:53:01

C#委托C#事件

2009-08-13 11:10:32

C#基础概念

2009-09-02 16:50:08

C#改写WM_GETT
点赞
收藏

51CTO技术栈公众号