//C#中虚方法用virtual修饰,是子类中的方法重写了父类的方法(此时,父类中的方法和基类的方法是同一个版本);
//针对虚方法Virtual,使用重载Override;作用主要体现在多态上(同一个操作move()取决于不同类的实例有不同的执行结果)
//C#中非虚方法,如果在子类中定义了同名的方法则默认隐藏了父类中的非虚方法,此时子类中实际存在两个版本的方法且名字相同;
//这种情况只在继承类(子类)中存在,在子类中默认优先使用新版本的方法,旧版本方法被隐藏了
//而且多层继承过程中的子类new产生的新版本,是就近继承,除非父类是PRIVATE类型的就跳级继承
//C#的隐藏和重写的确是有区别的,只有在反复改写程序并查看结果的不同才有深的体会,光看书和例子入门时很晕...
//重载:存在编译期的重载(普通方法的重载,编译器自动根据方法的签名不同而不同);和运行期的重载;
using System;
namespace Zoo
{
public class Animal : System.Object
{
protected static string name = "动物";
protected string _skincolor="野生动物的颜色";
protected double _height=1.78;
protected double _weight=300;
public void Move() //非虚方法
{
Console.WriteLine("动物要能够移动!!!");
}
public virtual void Eat() //虚方法
{
Console.WriteLine("动物要能够吃东西!!!");
}
}
public class Horse : Animal//马继承自动物类
{
private new string _skincolor="白龙马的颜色"; //声明此数据成员为新版本
public string SkinColor
{
get
{
return this._skincolor;
}
set
{
this._skincolor = value;
}
}
private new void Move() //非虚方法
{
Console.WriteLine("马也能够移动,还很快哦!!!");
}
public void ShowSkinColor()
{
Console.WriteLine("the horse's skincolor is: "+this._skincolor);
}
public override void Eat() //重写虚方法Eat(覆盖),在子类中重写从父类继承下来的成员方法
{
Console.WriteLine("马吃的是草,跑起来却很快哦!!!");
}
}
public class Zebra : Horse//斑马继承自马类
{
public void ShowZebra()
{
Console.WriteLine("本种族的名称为:"+name);
Console.WriteLine("本斑马毛色:" + this._skincolor);
Console.WriteLine("本斑马身高:" + this._height);
Console.WriteLine("本斑马体重:" + this._weight);
}
public new void Move() //子类中定义--父类中存在的成员,隐藏了父类中的成员
//此处的Move方法,默认继承就近的父类;如果就近的父类同名方法是Private就跳级继承
{
Console.WriteLine("斑马能够移动!!!");
}
public override void Eat() //重写虚方法Eat(覆盖),在子类中重写从父类继承下来的成员方法
{
Console.WriteLine("斑马吃草!!!");
}
}
public class Demo
{
public static void Main(string[] args)
{
Console.WriteLine("1-----针对非虚方法的隐藏");
Zebra z = new Zebra();
z.ShowZebra();
z.Move(); //子类隐藏父类的成员,没有new出现警告warning 。实际上是子类中存在两个同名的方法
Animal aone=new Animal(); //父类中的为老版本,子类中的为新版本;不过老版本被隐藏了,优先使用新版本的成员
aone.Move(); //父类中的Move()方法不变
Console.WriteLine("2-----针对虚方法的重载");
Horse h = new Horse();
z.Eat();
aone.Eat();
h.Eat(); //看起来隐藏和重写没什么区别,接着瞧吧...
Console.WriteLine("3-----看起来隐藏和重写没什么区别,接着瞧吧...");
Animal atwo=new Animal();
aone=h;
aone.Move();
atwo=z;
atwo.Move();
Console.WriteLine("-----隐藏针对非虚方法,子类和父类中的是同样的,只不过子类中存在两个版本的");
Console.WriteLine("-----执行过程看是谁发起的,就执行不同的版本,new不能用在重载override之前哦...");
aone.Eat();
atwo.Eat();
Console.WriteLine("-----重写是针对虚方法的,用处体现在多态上,同一个操作move()取决于不同类的实例");
Console.WriteLine("-----有不同的执行结果...");
}
}
}
以上,是我学习C#隐藏、重载的历程,有错误地方非常感谢留言指教.......