轉至:https://blog.csdn.net/yanhuatangtang/article/details/72772215
爲了避免冗餘,將幾個類中重複的成員單獨拿出來封裝成一個類,作爲這幾個類的父類。
父類---子類 基類----派生類
子類沒有繼承到父類的私有(private)字段,可以繼承屬性(public)和方法。
1、一個子類只能有一個父類(單根性)
2、可以傳遞性繼承(傳遞性)
查看類之間的關係可以通過 查看類圖選項, 選中解決方案,右鍵,查看類圖。
子類沒有繼承父類的構造函數
子類會默認調用父類的無參數構造函數,因爲要創建父類對象,讓子類可以使用父類中的成員。如果在父類中重新寫了一個有參數的構造函數,無參數的構造函數被覆蓋,子類就無法調用無參數的構造函數,子類報錯。
解決方法:
1、在父類中重新寫一個無參數的構造函數;
2、在子類中顯示的調用父類的有參數的構造函數,使用關鍵字base( ); // 一般使用此方法
子類中的方法名和父類中的方法名相同時,子類將父類的方法自動隱藏。在方法名前面加上關鍵字new,徹底將從父類繼承的方法隱藏。
子類可以直接調用父類的方法。
public class Person
{
string _name;
public string Name
{
get{return _name;}
set{_name=value;}
}
public Person(string name)
{
this.Name=name;
}
}
public class student:Person
{
public strudent(string name, int gender,int age,int id)
:base(name,gender,age)
{
this.Id=id;
}
}
public class teacher:Person
{
}
在項目中不應該把類都放在一個項目中。
// 正確顯示的格式
int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
student(string name,int ag)
: base(name)
{
_age = Age;
}
假設父類子類都含有方法 public void print(){ }
若在子類中將此方法隱藏,則爲 public new void print() { }
再次總結new的作用:
1、創建對象;
2、隱藏父類那裏繼承過來的同名成員,使子類調用不到父類的成員。
如果一個類沒有繼承其他類,默認繼承object類;其實:在C#中所有的類都直接或間接的繼承object類。
調用(父類與子類)
子類對象可以調用父類對象的成員,但是父類對象不可以調用子類的成員,只能調用自身的成員。
1、子類可以賦值給父類:應用 如果有一個地方需要一個父類做參數,我們可以用一個子類代替。
Person per=new student(); 或者寫成
Student str=new student ( );
Person s=str;
2、如果父類中裝的是子類對象,那麼可以將父類強制轉換爲子類對象;
如 上面的例子,滿足Person s=str; 則 強制轉換 : student ss = (student) s;
由於teacher是person的子類,但是不可以teacher tt=(teacher)s; 因爲父類中裝的是子類student中的對象。
需要進行判斷一下,使用is 或者 as
if(s is teacher){ // 成功返回TRUE,失敗返回FALSE
Teacher tt=(Teacher)s;
}else { }
或者使用as
Teacher t= s as Teacher; // 成功返回正確結果,錯誤返回NULL
父類與子類舉例:
namespace convert
{
class Program
{
static void Main(string[] args)
{
Person[] people = new Person[10]; // 存在了父類數組中
Random num = new Random();
for (int i = 0; i < 10; i++)
{
int rand = num.Next(1, 6); // 產生隨機數,注意這裏是產生1-6之間的隨機數,不包括6, 只產生0 、1、2、3、4、5
switch (rand)
{
case 1:
people[i] = new Vivi(); // 子類可以賦值給父類
break;
case 2:
people[i] = new Ququ();
break;
case 3:
people[i] = new Evil();
break;
case 4:
people[i] = new Wea();
break;
case 5:
people[i] = new Ewi();
break;
default:
people[i] = new Person();
break;
}
}
for (int i = 0; i < 10; i++)
{
if (people[i] is Vivi)
{
((Vivi)people[i]).showvivi(); // 父類可以轉換爲子類(前提是父類裝的是子類)
}
else if (people[i] is Ququ)
{
((Ququ)people[i]).showququ();
}
else if (people[i] is Evil)
{
((Evil)people[i]).showevil();
}
else if (people[i] is Wea)
{
((Wea)people[i]).showwea();
}
else if (people[i] is Ewi)
{
((Ewi)people[i]).showpeewi();
}
}
Console.ReadKey();
}
// 父類與子類的關係 5個子類
public class Person
{
public void showpeson()
{
Console.WriteLine("hello,i'm person");
}
}
public class Vivi : Person
{
public void showvivi()
{
Console.WriteLine("hello,i'm vivi");
}
}
public class Ququ : Person
{
public void showququ()
{
Console.WriteLine("hello,i'm Ququ");
}
}
public class Evil : Person
{
public void showevil()
{
Console.WriteLine("hello,i'm Evil");
}
}
public class Wea : Person
{
public void showwea()
{
Console.WriteLine("hello,i'm Wea");
}
}
public class Ewi : Person
{
public void showpeewi()
{
Console.WriteLine("hello,i'm ewi");
}
}
}
}