繼承:代碼文字結合理解
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