我们先看new:
示例:
public class Mankind
{
public Mankind()
{
}
public string walk()
{
return "直立行走";
}
}
public class Man:Mankind
{
public Man()
{
}
}
{
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()” {
public Man()
{
}
public string walk()
{
return "健步如飞";
}
}
实例化: 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()
{
}
}
{
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 "健步如飞";
}
}
{
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();
}
{
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 "水上漂";
}
}
{
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