继承是面向对象编程中的一个特性。这篇来介绍在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