C# 继承
继承是使用已经定义的类形成新类的方法。 新形成的类称为派生的类,我们派生的类称为基类。 继承的重要好处是代码重用和降低程序的复杂性。 派生类(后代)将覆盖或扩展基类(祖先)的功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Program.
using System;
namespace Inheritance
{
class Being
{
public Being()
{
Console.WriteLine("Being is created");
}
}
class Human : Being
{
public Human()
{
Console.WriteLine("Human is created");
}
}
class Program
{
static void Main(string[] args)
{
new Human();
}
}
}
在此程序中,我们有两个类。 基类Being
和派生的Human
类。 派生类继承自基类。
class Human : Being
在 C# 中,我们使用冒号(:)运算符创建继承关系。
new Human();
我们实例化派生的Human
类。
1
2
3
$ dotnet run
Being is created
Human is created
我们可以看到两个构造函数都被调用了。 首先,调用基类的构造函数,然后调用派生类的构造函数。
接下来是一个更复杂的示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Program.
using System;
namespace Inheritance2
{
class Being
{
static int count = 0;
public Being()
{
count++;
Console.WriteLine("Being is created");
}
public void GetCount()
{
Console.WriteLine("There are {0} Beings", count);
}
}
class Human : Being
{
public Human()
{
Console.WriteLine("Human is created");
}
}
class Animal : Being
{
public Animal()
{
Console.WriteLine("Animal is created");
}
}
class Dog : Animal
{
public Dog()
{
Console.WriteLine("Dog is created");
}
}
class Program
{
static void Main(string[] args)
{
new Human();
var dog = new Dog();
dog.GetCount();
}
}
}
我们有四个班。 继承层次更加复杂。 Human
和Animal
类继承自Being
类。 Dog 类直接继承自Animal
类,并间接继承自Being
类。 我们还介绍了static
变量的概念。
static int count = 0;
我们定义一个static
变量。 静态成员是类的所有实例共享的成员。
1
2
3
4
5
Being()
{
count++;
Console.WriteLine("Being is created");
}
每次实例化Being
类时,我们将 count 变量增加一。 这样,我们就可以跟踪创建的实例数。
1
2
3
4
5
class Animal : Being
...
class Dog : Animal
...
Animal
继承自Being
,Dog
继承自Animal
。 Dog
也间接继承自Being
。
1
2
3
new Human();
var dog = new Dog();
dog.GetCount();
我们从Human
和Dog
类创建实例。 我们称为 Dog 对象的GetCount()
方法。
1
2
3
4
5
6
7
$ dotnet run
Being is created
Human is created
Being is created
Animal is created
Dog is created
There are 2 Beings
Human
调用两个构造函数。 Dog
调用三个构造函数。 有两个实例化的存在。
我们使用base
关键字显式调用父级的构造函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Program.
using System;
namespace Shapes
{
class Shape
{
protected int x;
protected int y;
public Shape()
{
Console.WriteLine("Shape is created");
}
public Shape(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Circle : Shape
{
private int r;
public Circle(int r, int x, int y) : base(x, y)
{
this.r = r;
}
public override string ToString()
{
return String.Format("Circle, r:{0}, x:{1}, y:{2}", r, x, y);
}
}
class Program
{
static void Main(string[] args)
{
var c = new Circle(2, 5, 6);
Console.WriteLine(c);
}
}
}
我们有两个类:Shape
类和Circle
类。 Shape
类是几何形状的基类。 我们可以在此类中加入一些常见形状的共同点,例如x
和y
坐标。
1
2
3
4
5
6
7
8
9
10
public Shape()
{
Console.WriteLine("Shape is created");
}
public Shape(int x, int y)
{
this.x = x;
this.y = y;
}
Shape
类具有两个构造函数。 第一个是默认构造函数。 第二个参数有两个参数:x,y 坐标。
1
2
3
4
public Circle(int r, int x, int y) : base(x, y)
{
this.r = r;
}
这是Circle
类的构造函数。 此构造函数启动r
成员并调用父级的第二个构造函数,并向其传递x
和y
坐标。 如果不使用base
关键字显式调用构造函数,则将调用Shape
类的默认构造函数。
1
2
$ dotnet run
Circle, r:2, x:5, y:6
这是示例的输出。