概念:让一个对象能够表现出多种状态(类型)。
实现方法:
1.虚方法
2.抽象类
虚方法实现多态:
实现方法:
将父类方法标记为虚方法, 使用关键字
virtual,
这个函数可以被子类重新写一遍
然后在子类的方法写上
override。
我们创建一个人类Person 且里面有一个方法 SayHello()
public class Person
{
public virtual void SayHello()
{
}
}
再创建两个类分别是Man类和Woman类 且都继承于Person类
public class Man : Person
{
public override void SayHello()
{
Console.WriteLine("我是男人");
}
}
public class Woman : Person
{
public override void SayHello()
{
Console.WriteLine("我是女人");
}
}
当我们要实现Man和Woman类的方法的时候只需要创建一个对象即可
Person[] people=new Person[2]; //声明一个人类数组
people[0] = new Man();
people[1] = new Woman();
for (int i = 0; i < people.Length; i++) //遍历数组
{
people[i].SayHello();
}
Console.ReadLine();
最后结果为:
这时发现一个对象people拥有两种的状态(男人和女人) 这就简单实现了多态。
抽象类实现多态:
实现方法:
父类方法用abstract修饰 ,不允许有方法体 ,必须被子类override,且只能写在抽象类中。
抽象类就是在class前加上abstract。
还是刚才那个例子,我们发现Person类中的方法不需要实现,Person是一个抽象的名词,他的
方法体没有任何意义,所以可以将virtual改为abstract使之成为抽象方法。
public abstract class Person
{
public abstract void SayHello();//抽象方法没有方法体 直接在括号后加上分号
}
抽象类子类书写步骤和虚方法步骤一样
最后结果都为:
那么什么时候用虚方法实现多态什么时候用抽象类实现多态呢?
1.如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,使用虚方法。
2.如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义成抽象类
最后附上一张图用以区别抽象类和虚方法的不同:
以上就是实现多态的两种方式,面向对象思想博大精深,我也了解一点皮毛都算不上,希望以后大家共同成长。