C#中繼承與函數覆蓋,有時比較復雜,不小心很容易弄錯。所以有必要總結點規律出來。
(1)
當子類中擁有和父類一樣的可見field和member function時,子類中的field和member function會覆蓋父類中的定義。
using System;

namespace TestInheritance


{
public class Bird

{
public string type = "Bird";

public void ShowType()

{
Console.WriteLine("Type is {0}", type);
}
}
public class Chicken : Bird

{
//同名的field,可見性為public或者protected,不管有沒有聲明為new,均會覆蓋父類中的field
public new string type = "Chicken";
//當子類含有和父類相同的函數簽名(可見性public或者protected、函數名和參數都相同)時,不管帶new與否,都將覆蓋父類中相同的函數

public /**//*new*/ void ShowType()

{ Console.WriteLine();
Console.WriteLine("This is Chicken::ShowType()", type);
}
}

public class TestInheritance

{

public static void Main()

{
Bird bird = new Chicken();
bird.ShowType();
Console.WriteLine();
Chicken chicken = new Chicken();
chicken.ShowType();
Console.WriteLine();
Console.WriteLine("Type is {0}", chicken.type);
Console.Read();

}
}
}
如上例中的輸出會是:
Type is Bird
This is Chicken::ShowType()
Type is Chicken
(2) 當子類中的member function 和field作用范圍比父類中對應的member function和field小時,只會對作用范圍內的部分產生覆蓋影響,對作用范圍外無影響。
如下例:
using System;

namespace TestInheritance


{
public class Bird

{
public string type = "Bird";

public void ShowType()

{
Console.WriteLine("Type is {0}", type);
}
}
public class Chicken : Bird

{
//這里的type只會對Chicken內部的函數有影響,出了Chicken類,該函數不具有作用。
private new string type = "Chicken";

//這里的ShowType()函數只會對Chicken內部的函數有影響,出了Chicken類,該函數不具有作用。

private /**//*new*/ void ShowType()

{
Console.WriteLine("This is Chicken::ShowType()", type);
}
public void ShowInfo()

{
ShowType();
}
}

public class TestInheritance

{

public static void Main()

{
Bird bird = new Chicken();
bird.ShowType();
Console.WriteLine();
Chicken chicken = new Chicken();
chicken.ShowType();
Console.WriteLine();
Console.WriteLine("Type is {0}", chicken.type);
Console.WriteLine();
chicken.ShowInfo();
Console.Read();

}
}
}
輸出:
Type is Bird
This is Bird
Type is Bird
This is Chicken::ShowType()
又如下例:
using System;

namespace TestInheritance


{
public class Bird

{
public string type = "Bird";

public void ShowType()

{
Console.WriteLine("Type is {0}", type);
}
}
public class Chicken : Bird

{
//這里的type只會對Chicken內部的函數有影響,出了Chicken類,該函數不具有作用。
protected new string type = "Chicken";

//這里的ShowType()函數只會對Chicken內部的函數有影響,出了Chicken類,該函數不具有作用。

protected /**//*new*/ void ShowType()

{
Console.WriteLine("This is Chicken::ShowType()", type);
}
public void ShowInfo()

{
ShowType();
}
}

public class Cock : Chicken

{
public void ShowInfo()

{
Console.WriteLine("Cock::ShowInfo()");
//這里會調用Chicken的type成員
Console.WriteLine(type);
//這里將調用Chicken的ShowType()函數
ShowType();
}
}

public class TestInheritance

{

public static void Main()

{
Bird bird = new Chicken();
//調用Bird的ShowType()函數
bird.ShowType();
Console.WriteLine();
Chicken chicken = new Chicken();

//這里會調用Bird的ShowType();
chicken.ShowType();
//這里chicken.type會為Bird,因為Chicken類中type為protected,在這里沒法訪問
Console.WriteLine("Type is {0}", chicken.type);
chicken.ShowInfo();
Console.WriteLine();
Cock cock = new Cock();
cock.ShowInfo();
Console.Read();
}
}
}
會輸出:
Type is Bird
Type is Bird
Type is Bird
This is Chicken::ShowType()
Cock::ShowInfo()
Chicken
This is Chicken::ShowType()
(3) 當子類中的member function 和父類的member function名字相同但參數不同時,不會產生覆蓋。如:
using System;

namespace TestInheritance


{
public class Bird

{
public string type = "Bird";

public void ShowType()

{
Console.WriteLine("Type is {0}", type);
}
}
public class Chicken : Bird

{
//這里的type只會對Chicken內部的函數有影響,出了Chicken類,該函數不具有作用。
protected new string type = "Chicken";

//不會覆蓋Bird的ShowType函數,因為函數簽名不同(參數不同)

public /**//*new*/ void ShowType(int x)

{
Console.WriteLine("int {0}",x);
Console.WriteLine("This is Chicken::ShowType()", type);
}
public void ShowInfo()

{
//會調用Bird的ShowType函數
Console.WriteLine();
Console.WriteLine("Chicken::ShowInfo()");
ShowType();
}
}

public class Cock : Chicken

{
public void ShowInfo()

{
Console.WriteLine();
Console.WriteLine("Cock::ShowInfo()");
//這里會調用Chicken的type成員
Console.WriteLine(type);
//這里將調用Bird的ShowType()函數
ShowType();
}
}

public class TestInheritance

{

public static void Main()

{
Bird bird = new Chicken();
//調用Bird的ShowType()函數
bird.ShowType();
Chicken chicken = new Chicken();

//這里會調用Bird的ShowType();
chicken.ShowType();
//這里chicken.type會為Bird,因為Chicken類中type為protected,在這里沒法訪問
Console.WriteLine("Type is {0}", chicken.type);
chicken.ShowInfo();

Cock cock = new Cock();
cock.ShowInfo();
Console.Read();
}
}
}
輸出為:
Type is Bird
This is Bird
Type is Bird
Chicken::ShowInfo()
Type is Bird
Cock::ShowInfo()
Chicken
Type is Bird。
這里沒有列舉虛函數和override,考慮到篇幅,那個將在其它文章中予以說明,相信通過以上幾個實例,大家可以對函數覆蓋有個比較好的了解。