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