C#中的继承、隐藏与重写

从接触计算机程序已有几年的光景了,真正使用C#是在半年前,说实话,对于面向对象的一些知识尚知之甚少,用到的时候总是感觉拿不准,或者看过一次,以后很少用,又忘记了,今天借此空闲机会将C#中的继承、隐藏与重写整理出来,也是注册CSDN以来第一篇小文吧,如有不足之处,还望批评指正!

先看一个简单的继承例子:

public class Person
    {
        protected string name;
        public Person(string name)
        {
            this.name = name;
 
        }
        public void DiscribeYourself()
        {
            Console.WriteLine("my name is {0} i am a person",name);
        }
    }
    public class Student:Person
    {
        public Student(string name)
            : base(name)
        { }
        public  void DiscribeYourself()
        {
            Console.WriteLine("my name is {0}i am a student",name);
        }
 
    } 

在主函数中如下调用的:

   Person dev = new Person("dev");//自然调用本类构造函数
            dev.DiscribeYourself();//调用本类方法
            Person Car = new Student("car");//这个就像是父亲生了儿子,还是要调用父类的方法,使用声明类(即                                      Person类的方法)Car存储了Person的引用,它没有看student对此方法新的实现。使用初始声明为Person 的对象,即使给它赋一个student对象,也看不到派生类的new 方法。
            Car.DiscribeYourself();输出Car是一个Person
            Student mary = new Student("mary");
            mary.DiscribeYourself();//在这里子类隐藏了父类的方法,调用了Student类的方法,这样和在Student类的DiscribeYourself前加上new关键字是一样的,这便是继承中的隐藏。

如果是如下调用:dev=mary; dev.DiscribeYourself();   则调用了Person类的DiscribeYourself()方法;

如果是父类是虚函数那就不一样了,看下面的例子:

 public class Person
    {
        protected string name;
        public Person(string name)
        {
            this.name = name;
 
        }
        public virtual void DiscribeYourself()  //为了在派生类中重写此方法,所以声明为virtual的
        {
            Console.WriteLine("my name is {0} i am a person",name);
        }
    }
    public class Student:Person
    {
        public Student(string name)
            : base(name)
        { }
        public override void DiscribeYourself()//当生成该类对象时,它是最初的实现,所以它覆盖了父类的同名方法
        {
            Console.WriteLine("my name is {0} i am a student",name);
        }
 
    }

调方法如上例,而Car对象得出的结果却是不同的:my name is car i am a student

把基类写成virtual的,说明派生类可以重写基类里面,名称相同,签名相同的方法。用override关键字修饰派生类的方法,以达到写,当然重写不是必须的,可以重写,也可以不重写,依个人情况而定;在上例中,派生类重写了基类的方法,即使Car 声明为Person的,它仍然是一个student。这是因为基类方法是virtual的,派生了使用override重写了,编译时产生代码,进行运行检测,查找它的最初实现(即类的方法),即使把它声明为基类,还是执行检测到的代码。相反,如果不是重写,则在程序编译时已经定了,声明为哪个类的就调用哪个类的方法。new 关键字只是说明了派生类中有与基类同名,同签名的方法,在派生中产生一个新的方法,与基类无关。

好了,这篇小文就写到这吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值