virtual主要是实现重载,多态指的十多个方法名称相同、但是参数不同。

解决方案 »

  1.   

    rockrabbit(紫色石头) 
    十多个方法名称相同、但是参数不同 是重载的,override是另种重载呀.我觉得你懂得没我多呢.virtural当然可以属性.outspaceman(狮子洋) 
    我看了 C#完全手册,就这里一点小细节了.
      

  2.   

    public class Animal
    {
       public virtual int Feet
      {
         get;
      }  
    }public class Dog : Animal
    {
      private int feet = 4;
      public override int Feet
     { get return feet; }
    }public class Duck : Animal
    {
      private int feet = 2;
      public ovveride int Feet
      { get return feet; }
    }public class MainClass
    {
      public static void Main()
      {
        Animal animal_1 = new Dog();  //多态初始化方式
        Animal animal_2 = new Duck();
       
        Consol.Writeline( amimal_1.Feet); //多态展示
        Consol.Writeline( amimal_1.Feet);
       }
    }
      

  3.   

    这里 int feet 可以放在基类, 但通常情况下,方法要上抽至基类, 而数据要下放子类.
    如此,可保持类设计的灵活性.
      

  4.   

    摘于MSDN
    属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:可见,
    public virtual int Feet
      {
         get;
      }  
    是一个 get 访问器,因为他是一个virtual,所以没有给出具体实现。这样做主要是为了多态!
    相当于用virtual实现了成员方法的多态!
      

  5.   

    楼上配合不错 :)多态是面向对象语言的基本特性之一. 不仅仅是C#具备, C++, Java, SmallTalk, Ada
    也都是, 它们统统具备多态的特性. 所以,如果楼主尽可参考这些语言的多态资料.C#中的属性,是其方法的浓缩影子,浓缩成没有参数列表,而又可以返回和传值(咋看有点
    矛盾的称呼)的方法. [在C++中,实现它,就要用方法.]上面示例先定义一个基类: 动物, 有一个属性: 脚.   基类,通常是在现实中不存在的,
    弄出这个东西,调用它的用户就得更大的扩展性. (扩展性,灵活性,不是说出来的,是写出来的 :) )怎么扩展,怎么灵活? 比如,碰到一个变态的动物管理员, 非要数数动物园里的动物,共有几只
    脚. 别骂他,谁让人家是钱老大那. 那么没有多态的做法是:public enum Animal
    { Dog = 4, Duck = 2, Wolf = 4 }static public void Main()
    {
      long feetCount = 0;
      feetCount += Animal.Dog;  
      feetCount += Animal.Duck;
      feetCount += Animal.Wolf;
      
      Console.WriteLine( feetCount ); // display: 10
    }看到结果后,BT大发雷霆, 我的狗子有10只, 鸭子有3只, 狼仔1只, 你当我是白痴, 10只脚?
    哦, 哦, 应该是: 
    ...
    feetCount += (Animal.Dog * 10); 
    ...
    [幕后台词, 编码人员维护一次,骂娘一次]结果BT又吼: 我刚买的驴子没腿吗?  
    靠,再改:
    public enum Animal
    { Dog = 4, Duck = 2, Wolf = 4, Donkey = 4 }static public void Main()
    {
      long feetCount = 0;
      feetCount += ( Animal.Dog * 10 );  
      feetCount += ( Animal.Duck * 3 );
      feetCount += ( Animal.Wolf * 1 );      //发现了没有,每增加一个种类,这要加一行?
      feetCount += ( Amimal.Donkey * 2 );   Console.WriteLine( feetCount );        // display: 没算.
    }"猪脑子, 难道说我只喜欢腿, 就不喜欢尾巴了吗?" BT抓狂了.
    又来了,难道要咱们苦命的编码机器再写个 enum Ani_Tail{} ? 再象数腿代码一样,
    再数一数尾巴?  再多个美洲虎,怎么办? 两个 enum 再行扩展? 天知道BT会不会让咱们
    数耳朵,鼻孔眼.
    [幕后台词, 不想维护, 骂祖宗n次](待接..)
      

  6.   

    (接上文..)一套不具备维护的系统,只能称是佛脚系统,或梁老大(肇新)说的垃圾系统.
    显而易见,上面我写了个垃圾的动物管理系统.原因何在? 
    1.思想封闭,见树是树,不知有林.
    就是用户说一时,就做成一,不去考虑是否能变成二.2.编码硬板.
    enum通常用于固定常量定义, 显然动物种类不是. 这就意味着设计思路
    走偏了,把一般性,设计成了特殊性. 即,等待你的可能是巨量维护开销.
    虽然,这里以enum举例, 大家可能深以为然, 认为早该用个类来替换掉,
    但许多时候,写的类何常不是变样的enum呢? 我是深有感触.3.冗余垃圾代码过剩.
    象是这种:  feetCount += Animal.Dog;  
      feetCount += Animal.Duck;
      feetCount += Animal.Wolf;代码,是让人无法忍受的. 到也不是说我多么懒惰, 而是,3个这么写,
    那么30个,300个呢? 这种代码冗余,是最浅显的.
    再高一点,是函数级别的冗余,比如,一个函数内部写了段比较大小
    的代码,在另一个函数内也实现了同样(或稍有差异)的代码,这也是冗余.
    最高级别的冗余是,设计思想的冗余. 即系统设计的功能出现冗余.
    原本相同或差异不大的功能模块,同时出现在多个模块中充分开发.冗余就要重构. 这是许多国外大师常挂在嘴边的话.可扩展性,可维护性,更好的灵活性,这些可不是嘴巴说来的,而是
    用指头敲出来的. 我们当前的系统比较庞大,往往一个人设计的类
    多个人同时用.然后,这个人可能再引入别人的类. 而随着项目进度,
    哦,这个类还得再抽一抽.  当一个程序员,真正开始在项目中,设计基类,使用多态,才可以相信
    他对面向对象,有了较好的认识. 
      

  7.   

    to fanchka(狼仔) :
    还有下文吗?想听听你怎么用面向对象的实现方式避免“见树是树,不知有林.
    ”、“编码硬板”、“冗余垃圾代码过剩”这些问题(就以你说的数动物脚的问题为例子吧)。
      

  8.   

    可以参考这个:http://www.cnblogs.com/Hacker/archive/2004/08/10/31774.aspx