多态
1、定义:
what:多态是一种同一个行为具有多个不同表现形是或形态的能力
·白话表述:让一个对象表现出多种的状态(类型 )
·精炼表述:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态(老师说面试的时候用出来,还没有试过)
Why:解决对重复代码频繁修改的问题
2、多态的应用
实现多态的三种方法
a.虚方法
b.抽象类
c.接口
3、实现多态的两个要素
1)子类重写父类方法
2)转型
4、好处:
1)可替换性(subst ut ablity) 。多态对已存在代码具有可替换性。
2)可扩充性(extensibility) 。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性, 以及其他特性的运行和操作。
3)接口性(interface-ablity) 。多态是超类通过方法签名, 向子类提供了一个共同接口, 由子类来完善或者覆盖它而实现的。
4)灵活性(flexibility) 。它在应用中体现了灵活多样的操作, 提高了使用效率。
5)简化性(simplicity) 。多态简化对应用软件的代码编写和修改过程, 尤其在处理大量对象的运算和操作时, 这个特点尤为突出和重要。
5、向上转型和向下转型
向上转型:父类引用指向子类对象
例如:Animal anima = new Dog();
向下转型:子类引用指向父类对象
例如:Dog dog = (Dog) Animal;不安全
6、案例
class Animal
{
public virtual void Eat()//虚方法
{
Console.WriteLine("动物吃饭");
}
}
class Dog : Animal
{
public int age = 2;
public override void Eat()//子类重写父类
{
Console.WriteLine("狗吃骨头");
}
}
class Cat : Animal
{
public string sex = "公";
public override void Eat()//子类重写父类
{
Console.WriteLine("猫吃鱼");
}
}
//is用于判断一个类型是否是一种类型 son is Person :真或假
//as用于引用类型转换 成功则为非空,失败则为空 son as Person:null或对象
class Master
{
void Feed(Animal a)//父类做参数
{
if (a is Dog)//判断a是狗
{
// Dog d =(Dog) a;//向下转型
Dog d = a as Dog;//向下转型
d.age = 2;
Console.WriteLine("狗的年龄:" + d.age);
}
else if (a is Cat)//判断a是猫
{
Cat c = (Cat)a;//向下转型
c.sex = "母";
Console.WriteLine("猫的性别:" + c.sex);
}
a.Eat();
}
static void Main(string[] args)
{
Master m = new Master();
Animal dog = new Dog();//向下转型
m.Feed(dog);
Animal cat = new Cat();//向下转型
m.Feed(cat);
}
//看着有点绕,只要知道什么是向上转型,什么是向下转型就好了
//还有就是多态需要具备两个要素:
//a.子类重写父类方法
//b.转型