一.多态的实现
1.在面向对象思想中,多态的主要表现形式是:子类继承父类后对于同一个方法有不同的实现方式,多态的实现方式有两种:隐藏父类方法和重写父类方法
(1.)接下来先讲解使用new关键字隐藏父类方法来达到多态的目的,看如下代码:
class Animal
{
public void Show()
{
Console.WriteLine("发出了尖叫声");
}
}
class Bird:Animal
{
//在Bird类里面使用new关键隐藏父类成员并重写
public new void Show()
{
Console.WriteLine("鸟类发出了尖叫声");
}
}
在主函数分别调用两个类
class Program
{
static void Main(string[] args)
{
Bird bird = new Bird();
bird.Show();
Animal animal = new Animal();
animal.Show();
}
}
都进行实例化进行输出打印效果如下:
(2.)is-a关系可以和多态组合起来使用
在主函数内实例化一个is-a关系的对象
class Program
{
static void Main(string[] args)
{
//实例化了一个动物,这只动物是只鸟
Animal bird = new Bird();
bird.Show();
}
}
进行输出后如下图:
这说明通过new关键字进行隐藏重写的方法,实例化一个“is-a”关系的对象,然后调用里面的方法,这时候调用的是左边父类的show方法,而不是子类里面的show方法,在"is-a"关系的时候,如果想要调用子类的方法,就需要使用下面的方法重写实现
(2.)接下来讲解使用重写父类方法来达到多态的目的,看如下代码:
class Animal
{
//使用virtual关键字修饰方法,这个方法便成为了虚方法
public virtual void Show()
{
//父类必须定义为虚方法
Console.WriteLine("动物类发出了尖叫声");
}
}
class Bird:Animal
{
//在Bird子类使用override关键字来重写方法
public override void Show()
{
Console.WriteLine("鸟类发出了尖叫声");
}
public void Read()
{
Console.WriteLine("鸟类能读书");
}
}
在主函数内调用“is-a”关系并调用Show方法:
class Program
{
static void Main(string[] args)
{
Animal bird = new Bird();
bird.Show();
}
}
进行输出后如图:
进行override重写父类方法来实现多态目的后,这时“is-a”关系进行调用Show方法,执行的是子类的Show方法,而不是父类的Show方法。
但这样的“is-a”关系也只能调用父类继承下来并重写的方法,不能调用自己特有的方法,如下图:
这里并不能调用这个Bird对象里面的Read方法
注意:重写方法时,子类和父类方法的返回值,方法名和参数必须相同,子类方法的可访问性不能低于父类方法。