A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© rla540 中级黑马   /  2012-12-26 09:27  /  1754 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

c#中类的多态是怎么实现的?virtual和override在背后做了哪些事情?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

3 个回复

正序浏览
说简单点就是,多态是子类继承父类时,作了更改,实现“多态”。而virtual,标记父类,说明可以重写。override,标记子类,说明是重写的方法。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
实现多态有很多。。。
隐藏基类virtual重写父类override 抽象类抽象方法abstract
几个列子
虚方法
class A
{       
        public virtual void Fun()       
{               
        Console.WriteLine("A的");       
}
}
class B : A
{       
        public override void Fun()       
{               
        Console.WriteLine("A是虚的");       
}
}

抽象方法
abstract class A
{       
public abstract void Fun();
}
class B:A
{       
public override void Fun()       
{               
Console.WriteLine("A是抽象的);       
}
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王晨 于 2012-12-26 10:02 编辑

  多态是面向对象思想"三大特征之一,其余两个分别是封装和继承;它是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。
通过下面这个例子就很明显看出来了,例如:

  1. <FONT size=3>public class Animal
  2. {
  3.    public virtual void Eat()
  4.   {
  5.       Console.WriteLine("Animal eat");
  6.   }
  7. }

  8. public class Cat : Animal
  9. {
  10.     public override void Eat()
  11.    {
  12.       Console.WriteLine("Cat eat");
  13.     }
  14. }

  15. public class Dog : Animal
  16. {
  17.    public override void Eat()
  18.   {
  19.      Console.WriteLine("Dog eat");
  20.    }
  21. }

  22. class Tester
  23. {
  24.    static void Main(string[] args)
  25.    {
  26.       Animal[] animals = new Animal[3];
  27.       animals[0] = new Animal();
  28.       animals[1] = new Cat();
  29.       animals[2] = new Dog();
  30.       for (int i = 0; i < 3; i++)
  31.      {
  32.        animals[i].Eat();
  33.       }
  34.    }
  35. }</FONT>
复制代码
virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写;默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。


override 方法提供从基类继承的成员的新实现。由 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。
重写的基方法必须是vitural,override,abstract类型的 ,不能重写非虚方法或是静态方法;所以override不能与vitural,new,static同时使用

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马