Nick's Blog

C#面向对象之继承

继承是面向对象编程中的一个特性。这篇来介绍在C#中继承是如何实现和具体使用方法。

C#不允许一个类继承多个类,在使用时要注意。

继承的标准格式是冒号:

例如Class A继承Class B,需要写成 Class A : B

在使用继承的时候,子类自动继承父类所有属性和方法,当然我们也可以用virtual和override来重写父类的方法,举个例子:

    class Program
{
static void Main(string[] args)
{
Seden s1 = new Seden();
s1.yearOfMade = 1979;
s1.Run();
}
}
class Car
{
public int yearOfMade
{
get;
set;
}

public virtual void Run()
{
Console.WriteLine("It's Running");
}

}

class Seden:Car
{
public override void Run()
{
Console.WriteLine("Seden Run");
}
}

输出:

Seden Run

我们同样可以调用不重写的方法,我们可以在父类下增加以下代码:

        public virtual void GetYear()
{
Console.WriteLine(yearOfMade);
}

在调用程序中,我们可以通过以下来实现对于生产年份的调用:

            s1.yearOfMade = 1979;
s1.GetYear();

输出:

1979

如果在父类中的方法没有标识virtual,就不可以使用override来重写,要使用new关键字。

当然如果不想让子类继承父类,可以在父类前增加sealed。

在构造函数方面,如果子类和父类都有自己的构造函数,在实例化的过程中,父类的构造函数会被先调用,然后是子类的构造函数。

如果是子类想只继承自己的构造函数,可以通过:  this()来调用,例如:

 public Seden(string Made)
: this()
{
Console.WriteLine("Seden Made of {0}", Made);
}

如果子类要是继承了父类的构造函数,会在输出时显示两个构造函数,例如:

// 父类
public Car(string Made)
{
Console.WriteLine(Made);
}
// 子类
public Seden(string Made) : base(Made)
{
Console.WriteLine("Seden Made of {0}", Made);
}

调用函数以及输出:

Seden s2 = new Seden("Honda");
//OUTPUT
Honda
Seden Made of Honda

如何区分new和override?

举个例子来说明:

// 父类
public virtual void Run()
{
Console.WriteLine("It's Running");
}

public void Stop()
{
Console.WriteLine("Car is stop");
}
// 子类
public override void Run()
{
Console.WriteLine("Seden Run");
}

public new void Stop()
{
Console.WriteLine("Seden is stop");
}
// 调用函数
Car c1 = new Seden();
c1.Run();
c1.Stop();

输出:

Seden Run
Car is stop

因此使用override关键字,父类也被重写了。new关键字则是隐藏了父类的类,而没有重写,所以在用父类来实例化子类的时候,父类没有被重写的方法会被调用出来。

但是,如果非要使用子类中的函数,可以使用强制类型转换:

            ((Seden)c1).Stop();

输出:

Seden is stop