多态:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态
class Program
{
static void Main(string[] args)
{
//Person p = new Person();
//p.Show();
//p.Height();
//Console.ReadKey();
Animal[] animal = new Animal[3];
animal[0] = new Animal();
animal[1] = new Cat();
animal[2] = new Dog();
for (int i = 0; i < 3; i++)
{
animal[i].Eat();
}
}
}
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("动物叫");
}
}
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("猫叫");
}
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("狗叫");
}
}
结果为:动物叫
猫叫
狗叫
在上面的例子中,通过继承,使得Animal对象数组中的不同的对象,在调用Eat()方法时,表现出了不同的行为。
1.new的用法
class Program
{
static void Main(string[] args)
{
Animal animal = new Animal();
animal.Eat();
Animal ac = new Car();
ac.Eat();
Car c = new Car();
c.Eat();
Console.ReadKey();
}
}
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("动物叫");
}
}
public class Car : Animal
{
public new void Eat()
{
Console.WriteLine("汽车叫");
}
}
结果为:动物叫
动物叫
汽车叫
可以看出,当派生类Cat的Eat()方法使用new修饰时,Car的对象转换为Animal对象后,调用的是Animal类中的Eat()方法。其实可以理解为,使用new关键字后,使得Car中的Eat()方法和Animal中的Eat()方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。所以, Animal类中的Eat()方法不管用还是不用virtual修饰,也不管访问权限如何,或者是没有,都不会对Car的Eat()方法产生什么影响(只是因为使用了new关键字,如果Car类没用从Animal类继承Eat()方法,编译器会输出警告)。
2.override实现多态
class Program
{
static void Main(string[] args)
{
Animal[] animals = new Animal[3];
animals[0] = new Animal();
animals[1] = new Dog();
animals[2] = new WolfDog();
for (int i = 0; i < 3; i++)
{
animals[i].Eat();
}
Console.ReadKey();
}
}
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("动物叫");
}
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("狗叫");
}
}
public class WolfDog : Dog
{
public override void Eat()
{
Console.WriteLine("狼狗叫");
}
}
结果为:动物叫
狗叫
狼狗叫
在上面的例子中类Dog继承自类Animal,对方法Eat()进行了重写,类WolfDog又继承自Dog,再一次对Eat()方法进行了重写,并很好地实现了多态。不管继承了多少层,都可以在子类中对父类中已经重写的方法继续进行重写,即如果父类方法用override修饰,如果子类继承了该方法,也可以用override修饰,多层继承中的多态就是这样实现的。要想终止这种重写,只需重写方法时用sealed关键字进行修饰即可
http://www.cnblogs.com/charley_yang/archive/2010/09/11/1824025.html
3. abstract-override实现多态
class Program
{
static void Main(string[] args)
{
Animal[] animals = new Animal[3];
animals[0] = new Cat();
animals[1] = new Dog();
animals[2] = new WolfDog();
for (int i = 0; i < 3; i++)
{
animals[i].Eat();
}
Console.ReadKey();
}
}
public abstract class Animal
{
public abstract void Eat();
}
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("猫叫");
}
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("狗叫");
}
}
public class WolfDog : Dog
{
public override void Eat()
{
Console.WriteLine("狼狗叫");
}
}
结果为:猫叫
狗叫
狼狗叫
从上面可以看出,通过使用abstract-override可以和virtual-override一样地实现多态,包括多层继承也是一样的。不同之处在于,包含虚拟方法的类可以被实例化,而包含抽象方法的类不能被实例化
|