C#中的继承(一)
百科里关于继承的解释:
一、常见的解释
1.接续前人未完的事业。
2.承继死者的遗产或权利。
二、编程中的术语
“继承”是面向对象软件技术当中的一个概念。如果一个类B继承自另一个类A,就把这个B称为"A的子类",而把A称为"B的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。
这里给出类A和类B,具体说明请见注释:
类A:
public class A
{
public virtual void Fun1()
{
Console.WriteLine("A的第一个儿子");
}
public virtual void Fun2()
{
Console.WriteLine("A的第二个儿子");
}
public virtual void Fun3()
{
Console.WriteLine("A的第三个儿子");
}
public virtual void Fun4()
{
Console.WriteLine("A的第四个儿子");
}
public void Fun5()
{
Console.WriteLine("A的第五个儿子");
}
public void Fun6()
{
Console.WriteLine("A的第六个儿子");
}
public void Fun7()
{
Console.WriteLine("A的第七个儿子");
}
public void Fun8()
{
Console.WriteLine("A的第八个儿子");
}
}
{
public virtual void Fun1()
{
Console.WriteLine("A的第一个儿子");
}
public virtual void Fun2()
{
Console.WriteLine("A的第二个儿子");
}
public virtual void Fun3()
{
Console.WriteLine("A的第三个儿子");
}
public virtual void Fun4()
{
Console.WriteLine("A的第四个儿子");
}
public void Fun5()
{
Console.WriteLine("A的第五个儿子");
}
public void Fun6()
{
Console.WriteLine("A的第六个儿子");
}
public void Fun7()
{
Console.WriteLine("A的第七个儿子");
}
public void Fun8()
{
Console.WriteLine("A的第八个儿子");
}
}
类B,继承自类A:
public class B:A
{
//通过override重写基类中的虚方法Fun1
public override void Fun1()
{
Console.WriteLine("B的第一个儿子");
}
//隐藏基类中的虚方法Fun2
public void Fun2()
{
Console.WriteLine("B的第二个儿子");
}
//通过new重写基类中的虚方法Fun3,只在实例化本类B时覆盖父类方法Fun3
new public void Fun3()
{
Console.WriteLine("B的第三个儿子");
}
//子类中没有对父类的虚方法Fun4做任何处理
//Fun4
//编译通不过,因为A.Fun5未被标记为:virtual,abstract,overrde.无法进行重写.
//public override void Fun5()
//{
// Console.WriteLine("B的第五个儿子");
//}
//隐藏基类中的Fun6
public void Fun6()
{
Console.WriteLine("B的第六个儿子");
}
//通过new重写基类中Fun7
new public void Fun7()
{
Console.WriteLine("B的第七个儿子");
}
//子类中没有对父类的方法Fun8做任何处理
//Fun8
}
{
//通过override重写基类中的虚方法Fun1
public override void Fun1()
{
Console.WriteLine("B的第一个儿子");
}
//隐藏基类中的虚方法Fun2
public void Fun2()
{
Console.WriteLine("B的第二个儿子");
}
//通过new重写基类中的虚方法Fun3,只在实例化本类B时覆盖父类方法Fun3
new public void Fun3()
{
Console.WriteLine("B的第三个儿子");
}
//子类中没有对父类的虚方法Fun4做任何处理
//Fun4
//编译通不过,因为A.Fun5未被标记为:virtual,abstract,overrde.无法进行重写.
//public override void Fun5()
//{
// Console.WriteLine("B的第五个儿子");
//}
//隐藏基类中的Fun6
public void Fun6()
{
Console.WriteLine("B的第六个儿子");
}
//通过new重写基类中Fun7
new public void Fun7()
{
Console.WriteLine("B的第七个儿子");
}
//子类中没有对父类的方法Fun8做任何处理
//Fun8
}
以下是对类A和类B的操作:
public class P
{
static void Main(string[] args)
{
A A1 = new B();
Console.WriteLine("A1:");
A1.Fun1();
A1.Fun2();
A1.Fun3();
A1.Fun4();
A1.Fun5();
A1.Fun6();
A1.Fun7();
A1.Fun8();
B B1 = new B();
A A2 = B1;
//上面的两句:B B1 = new B();和A A2 = B1;相当于 A A1 = new B();
Console.WriteLine("B1:");
B1.Fun1();
B1.Fun2();
B1.Fun3();
B1.Fun4();
B1.Fun5();
B1.Fun6();
B1.Fun7();
B1.Fun8();
Console.WriteLine("A2:");
A2.Fun1();
A2.Fun2();
A2.Fun3();
A2.Fun4();
A2.Fun5();
A2.Fun6();
A2.Fun7();
A2.Fun8();
Console.ReadLine();
}
}
结果:{
static void Main(string[] args)
{
A A1 = new B();
Console.WriteLine("A1:");
A1.Fun1();
A1.Fun2();
A1.Fun3();
A1.Fun4();
A1.Fun5();
A1.Fun6();
A1.Fun7();
A1.Fun8();
B B1 = new B();
A A2 = B1;
//上面的两句:B B1 = new B();和A A2 = B1;相当于 A A1 = new B();
Console.WriteLine("B1:");
B1.Fun1();
B1.Fun2();
B1.Fun3();
B1.Fun4();
B1.Fun5();
B1.Fun6();
B1.Fun7();
B1.Fun8();
Console.WriteLine("A2:");
A2.Fun1();
A2.Fun2();
A2.Fun3();
A2.Fun4();
A2.Fun5();
A2.Fun6();
A2.Fun7();
A2.Fun8();
Console.ReadLine();
}
}
说明:
这里涉及到重写的方式(先不涉及抽象的概念):
virtual-override方式:
基类中被标识为virtual的方法其引用地址是程序在运行时才确定的,当父类访问子类时,如果子类中以override的方式重写了父类中的虚方法,这时虚方法的实际地址便指向被override覆盖的方法.如:A1.Fun1();
-new方式:重写基类中的方法(包括虚方法),只有当本类被实例化时才会覆盖父类的方法;
作者:青羽