C# 关于方法的隐藏和重载的比较

//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#隐藏、重载的历程,有错误地方非常感谢留言指教.......

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值