C# 面向对象——继承

继承:代码文字结合理解

class Program
    {
        static void Main(string[] args)
        {
            //Student s = new Student();

            //Driver d = new Driver();
            Student s = new Student("学生", 18, '', 101);
        }
    }

    /// <summary>
    /// 父类——人类
    /// </summary>
    public class Person
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private char _gender;

        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public void CHLSS()
        {
            Console.WriteLine("吃喝拉撒睡");
        }



        public Person(string name, int age, char gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
        }

        public Person()
        {

        }
    }

    /// <summary>
    /// 子类——学生
    /// </summary>
    public class Student : Person
    {

        public Student(string name, int age, char gender, int id)
            : base(name, age, gender)
        {
            //this.Name = name;
            //this.Age = age;
            //this.Gender = gender;
            this.Id = id;
        }


        private int _id;

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }



        public void Study()
        {
            Console.WriteLine("学生会学习");
        }
    }

    /// <summary>
    /// 子类——老师
    /// </summary>
    public class Teacher :Person
    {

        public Teacher(string name, int age, char gender, double salary)
            : base(name, age, gender)
        {
            this.Salary = salary;
        }

        private double _salary;
        public double Salary
        {
            get { return _salary; }
            set { _salary = value; }
        }
        public void Teach()
        {
            Console.WriteLine("老师会讲课");
        }
    }

    /// <summary>
    /// 子类——司机
    /// </summary>
    public class Driver:Person
    {

        public Driver(string name, int age, char gender, int driveTime)
            : base(name, age, gender)
        {
            this.DirveTime = driveTime;
        }


        private int _dirveTime;
        public int DirveTime
        {
            get { return _dirveTime; }
            set { _dirveTime = value; }
        }
        public void Drive()
        {
            Console.WriteLine("司机会开车");
        }
    }

我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,
单独的封装到一个类中,作为这些类的父类。
Student、Teacher、Driver 子类 或 派生类
Person 父类  或  基类
问题:子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
问题:子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数,
创建父类对象,子类可以使用父类中的成员。
所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,
子类就调用不到了,所以子类会报错。
解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()

 注意:子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。

里氏转换
1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。

 

is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null

posted @ 2016-07-06 15:02  幻影星辰  阅读(444)  评论(0编辑  收藏  举报