什么是方法重写?
方法重写是指子类继承父类后在子类中有一个与父类中某个方法签名一致,但方法内容可以重新定义的方法,并用override关键字修饰。只有用virtual、abstract、override修饰的方法在继承后子类可以重写。
方法重写的意义:
为所有子类定义了某种规范(某种必须有的规范),多态。-----------这里的规范可以理解为”行为“,就是方法,等同于接口中提到的规范。其实目的就是让新增加的类必须具有某些方法,这样才能满足我们程序中的要求。(对程序扩展做了一定的约束)
什么是虚方法?
使用virtual关键字修饰,写在返回值类型前面:public
virtual 或 virtual
public。虚方法必须在本类中有实现,哪怕是空的实现{}。例:person类中的虚方法毫无意义,中国人显示中国国籍,美国人显示美国国籍。
虚方法存在的意义就是为了让子类重写。子类可以重写,也可以不重写。子类不重写时,调用父类的虚方法,这也就是为什么父类虚方法必须有实现的原因。重写时用override关键字修饰。-----------方法重写时,方法签名必须与父类中的虚方法完全一致,否则重写不成功,其中包括“返回值”。
方法重写与方法重载:
一个函数由这么几部分组成,函数名、参数个数、参数类型、返回值,就是把函数名字去掉以后,剩下的东西(返回值、参数、调用方式等)就是函数的签名。函数在重载时,利用函数签名的签名参数列表不同(即参数个数与类型的不同)来区别调用者到底调用的是那个方法。构成重载的条件:签名参数列表不同(参数类型不同,顺序不同或者参数个数不同),与返回值无关。
重载是方法的名称相同。参数个数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。
方法重写时,方法签名必须与父类中的虚方法完全一致。方法重写(Override)是面向对象的概念。
什么是抽象类?
abstract关键字修饰;不能实例化;可以有抽象成员也可以有非抽象成员。如果一个类中有任何抽象成员,那么这个类必须标记为抽象类abstract
class。.类中的抽象成员在子类中必须实现(override),除非子类也是抽象类。抽象成员在抽象类中不能有任何实现。
练习1:形状类Shape(父类),包含Size属性和计算面积getArea()方法。圆类Circle继承Shape,可以计算圆的面积。正方形类Square继承Shape,可以计算正方形面积。最终要求能实现:Shape
sh=new Circle(5);sh.getArea()能计算出圆的面积。Shape sh=new
Square(5);sh.getArea()能计算出正方形的面积。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 计算面积
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12
13 //Shape shape1 = new Circle(5);
14 //Console.WriteLine(shape1.getArea());
15
16 //Shape shape2 = new Square(10, 10);
17 //Console.WriteLine(shape2.getArea());
18
19 //计算面积.Circle
20
21 Circle c1 = new Circle(10);
22 Console.WriteLine(c1.ToString());
23
24 Console.ReadKey();
25 }
26 }
27
28 /// <summary>
29 /// 形状类
30 /// </summary>
31 abstract class Shape
32 {
33 private double _width;
34
35 /// <summary>
36 /// 宽
37 /// </summary>
38 public double Width
39 {
40 get { return _width; }
41 set { _width = value; }
42 }
43
44 private double _height;
45
46 /// <summary>
47 /// 高
48 /// </summary>
49 public double Height
50 {
51 get { return _height; }
52 set { _height = value; }
53 }
54
55
56 /// <summary>
57 /// 计算指定图形的面积,抽象方法
58 /// </summary>
59 /// <returns></returns>
60 public abstract double getArea();
61
62 }
63
64
65 /// <summary>
66 /// 圆类
67 /// </summary>
68 class Circle : Shape
69 {
70 public Circle(double r)//含参数的构造函数
71 {
72 this.Height = r;
73 this.Width = r;
74 }
75
76 /// <summary>
77 /// 计算圆的面积
78 /// </summary>
79 /// <returns></returns>
80 public override double getArea()//方法重写
81 {
82 return this.Width * this.Height * Math.PI;
83 }
84 public override string ToString()//
85 {
86 //return base.ToString();
87 return getArea().ToString();
88 }
89 }
90
91 class Square : Shape
92 {
93 public Square(double w, double h)//含参数的构造函数
94 {
95 this.Width = w;
96 this.Height = h;
97 }
98
99 /// <summary>
100 /// 计算正方形面积
101 /// </summary>
102 /// <returns></returns>
103 public override double getArea()
104 {
105 return this.Height * this.Width;
106 }
107 }
108 }