您的位置:首页 > 编程语言 > C#

C#之多态

2015-11-21 23:08 302 查看
       一、什么是多态

       简单来说,多态就是对象可以表现多个类型的能力,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。

       二、几种建立多态的方式

       1、用父类实现多态

       多个类可以从单个基类“继承”。通过继承,类在基类所在的同一实现中接收基类的所有方法、属性和事件。这样,便可根据需要来实现附加成员,而且可以重写基成员以提供不同的实现。

      (1、)使用new修饰符隐藏父类的成员

        在子类中,可用new修饰符隐藏父类的成员,隐藏父类的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。

class Program
{
static void Main(string[] args)
{
Aniaml a = new Aniaml();
a.Eat();
Dog dog = new Dog();
dog.Eat();
Aniaml animal = dog; //dog对象赋给animal变量
animal.Eat(); //调用dog的Eat旧方法—父类的方法
}
}
class Aniaml //定义动物类Animal
{
public void Eat()
{
Console.WriteLine("动物吃东西");
}
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
new public void Eat() //new隐藏父类成员
{
Console.WriteLine("狗吃骨头");
}
}       可以理解为,使用new关键字后,使得Dog中的Eat方法和Animal中的Eat方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。
      (2、)使用override重载父类成员实现多态

        virtual供父类的函数成员使用,表明是虚拟的成员

        override供子类的函数成员使用,表明是重载的成员

        父类的虚拟函数可以被重载,其他的成员不可以被重载

class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Cat cat = new Cat();
Aniaml animal = dog ; //dog对象赋给animal变量
animal.Eat(); //继承的父类方法已被完全覆盖,等价于dog.Eat()
animal = cat;
animal.Eat(); //等价于cat.Eat()
}
}
class Aniaml //定义动物类Animal
{
public virtual void Eat()
{
Console.WriteLine("动物吃东西");
}
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
}
class Cat : Aniaml
{
public override void Eat()
{
Console.WriteLine("猫吃鱼");
}
}       子类重载父类的虚拟函数,然后由父类变量引用不同子类对象的同名函数,同样的animal.Eat方法,运行结果不同,这是行为多态性。
       2、用抽象类实现多态

       抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。 

class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Eat();
Console.ReadKey();
}
}
public abstract class Aniaml //定义抽象类Animal
{
public abstract void Eat(); //定义抽象方法Eat
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
}       抽象方法只是对方法进行了定义,而没有实现,如果一个类包含了抽象方法,那么该类也必须用abstract声明为抽象类,一个抽象类是不能实例化的。
       3、用接口实现多态

       多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。 

interface IShout //定义接口IShout
{
void IShout();
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.IShout();
Cat cat = new Cat();
cat.IShout();
}
}
class Dog :IShout //实现接口IShout
{
public void IShout()
{
Console.WriteLine("我会叫");
}
}
class Cat :IShout //实现接口IShout
{
public void IShout()
{
Console.WriteLine("我也会叫");
}
}        狗会叫,猫也会叫,它们都有会叫的能力,因此可以通过定义和实现接口来实现功能的添加,也实现了多态性。
      以上是自己关于C#多态的一个简单总结,不断努力,不断进步。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: