博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

new和override比较

Posted on 2008-04-17 17:48  froglog  阅读(213)  评论(0编辑  收藏  举报


我们先看new:
示例:

 public class Mankind
    
{
        
public Mankind()
        
{
        }

        
public  string walk()
        
{
                    
return "直立行走";
        }

    }


    
public  class Man:Mankind
    
{
        
public Man()
        
{
        }

    }


编译结果正确;
实例化:Man man=new Man()
输出man.walk()结果:“直立行走”

我们把Man类修改如下:
 public  class Man:Mankind
    
{
        
public Man()
        
{
        }

        
public  string walk()
        
{
            
return "健步如飞";
        }

    }

编译正确,并且可以执行,但出现:“Man.walk()”上要求关键字 new,因为它隐藏了继承成员“Mankind.walk()”
实例化: Man man = new Man()
 输出man.walk()结果: "健步如飞"

但是当我们按照下面这种方式实例化:
Mankind man = new Man()
输出man.walk()结果: "直立行走"

把Man类walk()方法加上new关键字:
 Man man = new Man()
输出man.walk()结果: "健步如飞"
Mankind man = new Man()
 输出man.walk()结果: "直立行走"


我们在来看override:
示例:
public  class Mankind
    
{
        
public Mankind()
        
{
        }

        
public virtual string walk()
        
{
                    
return "直立行走";
        }

    }


    
public  class Man:Mankind
    
{
        
public Man()
        
{
        }

    }


编译结果正确;
实例化: Man man = new Man()
输出man.walk()结果: "直立行走"
我们把Man类修改如下:
   public  class Man:Mankind
    
{
        
public Man()
        
{
        }

        
public  string walk()
        
{
            
return "健步如飞";
        }

    }

编译正确,并可以执行,但出现:“Man.walk()”将隐藏继承的成员“Mankind.walk()”。若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。
实例化: Man man = new Man()
 输出man.walk()结果: "健步如飞"

我们按照下面这种方式实例化:
 Mankind man = new Man()
 输出man.walk()结果: "直立行走"

把Man类walk()方法加上override关键字:
Man man = new Man()
输出man.walk()结果: "健步如飞"
Mankind man = new Man()
 输出man.walk()结果: "健步如飞"

这时我们几个个疑问:

 1.子类Man 覆盖了父类Mankind 的walk()方法,但如果我们想让子类Man 输出"直立行走"可以做到吗?
public string BaseWalk()
{
    
return base.walk();        
}


 Mankind man = new Man()
编译错误:“Mankind”并不包含对“BaseWalk”的定义
 Man man = new Man()
输出man.BaseWalk()结果: "直立行走"

2.Man 的子类可以再次重写walk()方法吗?
 
public  class Superman:Man
    
{
        
public Superman()
        
{
        }

        
public override string walk()
        
{
            
return "水上漂";        
        }

    }


Superman man = new Superman();
Man man = new Superman();
 ManKind man = new Superman();
 输出man.walk()结果均为: "水上漂"
如果Superman中walk()方法override 前再加修饰符virtual 编译报错:标记为 override 的成员“Superman.walk()”不能标记为 new 或 virtual