一、隐藏
如果基类和派生类声明了两个具有相同签名的方法,编译时会显示一个警告。
方法签名由方法名、参数数量和参数类型共同决定,方法的返回类型不计入签名。
派生类方法会隐藏(或屏蔽)基类中具有相同签名的方法。
——《Visual C#2013从入门到精通》
简单地说:派生类可以隐藏父类的成员,如果在派生类中声明了与父类同名的新成员时,父类的该成员就不能在派生类中被访问到。
1.在派生类中声明的成员变量与父类同名,则父类成员在派生类中被隐藏了
class Animal
{
public int age=24;
int sex;
}
class Cat : Animal
{
public int age = 12;
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Console.WriteLine("cat's age is {0}", cat.age);
Animal animal = new Animal();
Console.WriteLine("animal's age is {0}", animal.age);
}
}
运行结果:
cat's age is 12
animal's age is 24
2.在成员函数声明中,子类可以包含一个new修饰符来表示与父类的同名方法的区别
class Animal
{
public int age=24;
public void showAge()
{
Console.WriteLine("animal's age is {0}",age);
}
}
class Cat : Animal
{
new public int age = 12;
new public void showAge()
{
Console.WriteLine("cat's age is {0}", age);
}
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
cat.showAge();
Animal animal = new Animal();
animal.showAge();
Animal animal1 = new Cat();
animal1.showAge();
}
}
运行结果:
cat's age is 12
animal's age is 24
animal's age is 24
隐藏的时候可以使用new显示说明,在编程的过程中,没有写new的时候也是可以编译通过的,不过可能会有警告。
二、覆盖(重写)
虚方法: 如果希望父类某个方法的实现能够在子类中进一步得到改进,那么将父类的该方法定义为虚方法使用virtual关键字定义虚方法
覆盖: 如果希望改进父类的某个虚方法,使用override关键字覆盖父类的方法,提供自己的实现就可以了。当覆盖虚方法时,覆盖的方法必须与被覆盖的方法具有相同的方法签名。子类的override方法在名称、参数类型、参数名称、参数顺序、返回值类型都必须与基类中的虚方法完全一样。
class Animal
{
public int age=24;
public virtual void showAge()
{
Console.WriteLine("animal's age is {0}",age);
}
}
class Cat : Animal
{
new public int age = 12;
public override void showAge()
{
Console.WriteLine("cat's age is {0}", age);
}
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
cat.showAge();
Animal animal = new Animal();
animal.showAge();
Animal animal1 = new Cat();
animal1.showAge();
}
}
运行结果:
cat's age is 12
animal's age is 24
cat's age is 12
隐藏PK覆盖
隐藏在静态编译的确定执行对象。
覆盖在动态编译时确定执行对象。
观察代码中黄色标明的部分,在隐藏时,声明的对象是Aniaml类型,就决定了调用的函数是Animal这个父类中的函数。而在覆盖的时候,虽然声明的对象是Animal,但是在动态编译的过程中发现实际执行的是Cat对象,就会调用Cat中的方法。体现了继承的多态性。
需要注意的几点:
1.虚方法和覆盖(重写)方法的签名必须是一致的。
2.只能重写虚方法,其他方法不能被重写。
3.如果派生类不用override关键字声明方法,就不是覆盖(重写)基类方法,而是隐藏基类方法。
4.两个方法必须具有相同的可访问性。
5.重写方法隐式地成为虚方法,可在派生类中重写。