重载好像不会引发多态性吧,重载一般发生在同一个类中,当调用时很好找,只要按照形参列表找即可;子类与父类间偶尔也会发生重载,这想想也能理解,调用时只要找到对应形参列表的方法即可。
下面说一下多态,只有重写了父类(可以是普通基类、抽象类和接口中的任意一种)的方法才会发生多态
一、 对于普通基类,如果按下述写法不会发生多态
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VirtualTest
{
class Program
{
static void Main(string[] args)
{
Parent p = new Child();
p.draw();
(p as Child).draw();
}
}
class Parent
{
public void draw()
{
Console.WriteLine("绘制图形……");
}
}
//C#中,这样写不会发生多态
class Child : Parent
{
public void draw()
{
Console.WriteLine("绘制三角形……");
}
}
}
运行结果如下:
上述情况可能不是我们需要的,我们常常是想通过基类的引用调用子类中的与父类同名的方法,这时就需要使用 virtual和override两个关键字,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VirtualTest
{
class Program
{
static void Main(string[] args)
{
Parent p = new Child();
//发生多态
p.draw();
}
}
class Parent
{
public virtual void draw()
{
Console.WriteLine("绘制图形……");
}
}
//C#中,这样写不会发生多态
class Child : Parent
{
public override void draw()
{
Console.WriteLine("绘制三角形……");
}
}
}
运行结果:
二、对抽象类中抽象方法的重写,有一个或多个抽象方法的类就是抽象类。这时对发生多态的分析类似于Java,只不过,子类重写基类方法时用override关键字。
三、对接口中方法的重写,c#中接口所有成员都是abstract的,JDK1.8之前的接口也是这样的,1.8之后对这一概念进行了扩展。