黑马程序员--面向对象的三大基本特征(继承)(03)

来源:互联网 发布:sql server 2000下载 编辑:程序博客网 时间:2024/05/20 16:35

----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

面向对象的三大基本特征: 封装 继承  多态。

一.继承

    1.继承的概念
          (1)如果A类具有B类所有的特性,那么就说A类继承了B类。在C#中A类也叫做父类或者基类,B类就叫做子类或者是派生类。判断一个继承的合理性:子类is a 父类。
          (2)继承是类与类之间的一种关系,例如:我的这台华硕电脑(对象)继承自华硕电脑(类),这种说法是不正确。
注意:记住继承里面的一些专业术语,对以后看文档很有帮助:父类(Parent Class)  和子类(Child Class)
                                                        基类(Base Class)和派生类(Derived Class)
          (3) 继承的特性:类的单根继承性和传递性
类的单根继承性:通俗一点说就是一个类只能同时继承自一个父类。
传递性:子类A继承了父类B 然后B类又继承了C类  传递性体现在A类不仅继承了B类的所有特性,而且还继承了C类的所有特性。
下面举例来说明继承:

    public class Person//父类
    {
        private string name;
        public string Name//Name属性
        {
            get;
            set;
        }
        public int Age//Age属性
        {
            get;
            set;
        }
    }

    public class Student : Person//子类
    {
        public int Score//特有的成绩属性
        {
            get;
            set;
        }
        public void Learn()//特有的方法
        {
            Console.WriteLine("学习 学习 还是学习");
        }
    }
    写完这两个类后,再到控制台Main()方法中new一个student类对象和一个Person类对象
查看一下效果:

     通过上面这张截图大家可以发现,当用对象st去调用自己类成员时,发现成员列表中不仅有自己类中的成员Score属性和Learn方法,而且还有父类中的Age,Gender,Name三个属性。所以说在继承关系中:子类继承了基类的所有方法和属性,只是用private修饰的属性和方法无法访问到而已(其中Person类中的name字段是访问不到的)。
    另外不知道大家发现没有下面的这张截图中,当用Person类对象ps去调用自己的类成员时,为什么成员列表里面除了有自己类中定义的Age,Gender,Name三个属性之外,还有Equals,GetHashCode,GetType,Tostring四个方法(Person类也没有显示继承什么类啊)?这四个方法是从哪里来的呢?
  其实原理很简单:
      (1)C#中所有的类都直接或间接的继承了Object类。(祖先类)
       (2) 如果一个类没有显示继承自任何类,则默认情况下是继承自Object类,就像本例中的Person类,所以当用类对象ps调用自己的成员时,列表中不仅有自己类中的成员,还有object类中的四个方法。
     (3)如果一个类显示的继承自某个类,则将覆盖默认继承的Object类(要符合的继承单根性)这个就像本例中的Student类。至于Student类对象st的成员列表中为什么也会有那四个方法,是因为继承的传递性。

  2.继承中对象的隐式转换和显式转换

        (1) 可以用父类变量指向子类对象
   例如:上例中 Person是父类,Student是子类;父类变量可以指向子类变量
        Student ps= new Student();       
        Person per=ps;          
 上述过程可以理解为;就是给实在的东西贴标签的过程,此处是把人的标签贴在学生的实例上。它等价于 Person per=new Student();   
       (2) 也可以把子类变量指向这个父类变量的时候需要做类型转换
   例如:  Person per=new Student(); //人的标签贴在学生的实例上        
               Student lsPerson=(Student)per;//程序执行时,不会往上面看,所以需要注明per这个实例是属于Student类的

 3. 继承中构造函数要点

   (1)继承时,构造函数是不能被继承的。
   (2)子类的构造函数会默认地去调用父类的无参构造函数,所以如果父类中是一个有参数的构造函数(这样父类就没有无参构造函数),那么当调用子类构造函数时就会报错。
   (3)利用父类的构造函数给子类赋值(通过base关键字来实现)
举例:
          public class Person//父类
    {
        public Person(string name, int age)//有参数构造函数
        {
            this.Name = name;
            this.Age = age;
        }
        public string Name//Name属性
        {
            get;
            set;
        }
        public int Age//Age属性
        {
            get;
            set;
        }
    }


    public class Student : Person//子类
    {
        //除了继承Person类中的所有特性,还有自己特有的特性
        public Student(string name, int age, int score)//构造函数
            :base(name,age)
        {
            //this.Name = name;
            //this.Age = age;         注释掉了不用写
            this.Score = score;
        }
        public int Score//特有的成绩属性
        {
            get;
            set;
        }
        public void Learn()//特有的方法
        {
            Console.WriteLine("学习 学习 还是学习");
        }
    }控制台的结果:

   4. 继承中 Base 和this 关键字的作用比较

         Base关键字:(1)像上例中那样,通过使用Base关键字子类能够调用父类构造函数来初始化对象
                   (2)能够用Base关键字来调用父类成员 base.Name

      This关键字: (1)通过使用This关键字当前类能够调用自己当前类中的构造函数。
                   (2)能够用This关键字来调用类成员 this.Name



----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
原创粉丝点击