一.多态的定义
1.什么是多态
.通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态
2.为什么要用多态
解决:对重复代码频繁修改
二.实现多态的两个要素
1.子类重写父类的方法
2.具有向上转移,把子类的对象赋值给父类的对象,然后再调用方法,这里调用的是子类的方法
class Animal
{
public virtual void call()
{
Console.WriteLine("无声的叫唤");
}
}
class Dog : Animal
{
// new的作用是隐藏父类的同名方法
//public new void call() {
//Console.WriteLine("叫声:汪~汪~汪~");
//}
public override void call()
{
Console.WriteLine("叫声:汪~汪~汪~");
}
public void smell()
{
Console.WriteLine("嗅觉相当不错!");
}
}
Animal animal = new Dog(); //向上转型
animal.call();//输出叫声:汪~汪~汪~
三.多态的两种运用
1.父类做返回值
class Person
{
public virtual void Eat()
{
}
}
class WhitePerson:Person
{
public override void Eat()
{
Console.WriteLine("热狗");
}
}
class YellowPerson:Person
{
public override void Eat()
{
Console.WriteLine("饺子");
}
//写一个GetPerson方法,返回值为父类,
//根据传入的不同人种来确定吃什么
Person GetPerson(string s)
{
Person p=null;
if (s.Equals("中国人"))
{
p = new YellowPerson();
}
else if (s.Equals("外国人"))
{
p= new WhitePerson();
}
else
{
return p;
}
p.Eat();
return p;
}
}
2.父类做参数
class Animal
{
public virtual void Swimming()
{
Console.WriteLine("动物游泳");
}
}
class Cat:Animal
{
public override void Swimming()
{
Console.WriteLine("猫挠");
}
//写一个方法,完成动物游泳(对象做参数)
void GetSwimming(Animal a)//a是引用
{
if (a is Cat)
{
Cat c = (Cat)a;//向下转型
c.Swimming();
}
}
static void Main(string[] args)
{
Cat c = new Cat();
Dog d = new Dog();
Animal a = c;
// Animal a = d;
c.GetSwimming(a);
}
}
四.is和as关键字
is用于判断一个类型是否是一种类型或其父类型 son is Person :真或假
is关键字是用于检查对象是否与给定类型兼容,如果兼容就返回true,如果不兼容就返回false。
as用于引用类型转换 成功则为非空,失败则为空 son as Person:null或对象
as的使用:可用于将对象转换为指定类型,可直接进行类型转换,如果转换成功会返回转换后的对象,如果转换不成功则不会抛出异常,而是返回null。
五.多态的好处
1.可替换性(subst ut ablity) 。多态对已存在代码具有可替换性。
2.可扩充性(extensibility) 。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性, 以及其他特性的运行和操作。
3.接口性(interface-ablity) 。多态是超类通过方法签名, 向子类提供了一个共同接口, 由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility) 。它在应用中体现了灵活多样的操作, 提高了使用效率。
5.简化性(simplicity) 。多态简化对应用软件的代码编写和修改过程, 尤其在处理大量对象的运算和操作时, 这个特点尤为突出和重要。