菜鳥的C#學習之旅——多型的實現途徑
目錄
一、定義
二、虛方法:
三、抽象類與抽象方法:
四、介面實現:
五、總結:
一、定義
多型:在面嚮物件語言中,介面的多種不同實現方式即為多型
多型性就是指在程式執行時,執行的雖然是一個呼叫方法的語句,卻可以根據派生類物件的型別的不同完成方法不同的具體實現。在C#中可以通過多種途徑實現多型性。
二、虛方法:
將父類的方法標記為虛方法,使用關鍵字virtual,此方法在子類中可以重寫(使用關鍵字override)
1.當某個例項方法宣告包括 override 修飾符時,該方法將重寫所繼承的具有相同簽名的虛方法。
2.子類可以重寫父類,可以不重寫。
(1)重寫:當子類重寫的時候,顯示的就是重寫後的內容;
(2)隱藏:當子類不進行重寫的時候,顯示的就是原來父類中的內容。
3.重寫只能重寫父類的虛方法,實方法是不可以重寫的。
4.虛方法不能用 static 修飾 。
5.虛方法不能用 private 修飾,因為虛方法就是讓子類來重寫的,如果宣告為 private,子類就無法重寫,所以不能是私有的 。
6.例項(程式碼展示)
static void Main(string[] args) { //可以在父類的方法的修飾符後面加 virtual //在子類中重寫父類的方法,加上一個override;呼叫父類的方法,但是把父類的方法進行重寫了 //更換了方法裡面的內容 Person p = new Person(); p.Show(); Teacher t = new Teacher(); t.Name = "張三"; t.Age = 90; t.Gender = '男'; t.Show(); Console.ReadKey(); } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private char _gender; public char Gender { get { return _gender; } set {_gender = value ;} } private int _age; public int Age { get { return _age; } set { _age = value; } } public virtual void Show()//虛方法---- { Console.WriteLine("我是人別害怕"); } public void Say() { Console.WriteLine("Hello"); } } public class Teacher : Person { public override void Show() { Console.WriteLine("我是老師"); }
三、抽象類與抽象方法:
如果我們不需要使用父類建立物件,它的存在只是為供子類繼承。可以將父類寫成抽象(關鍵字abstract)類,將父類的方法
寫成抽象方法,子類中的方法仍用關鍵字override重寫。
1.抽象方法使用 abstract 修飾符進行宣告,並且只有在同樣被宣告為 abstract 的類中才允許出現。
2.抽象方法必須在每個非抽象派生類中重寫。
3.抽象方法沒有方法體。
4.抽象類無法例項化。
5.抽象類中的抽象方法是給子類寫的,父類自己用不了。
6.父類是抽象類,子類繼承了這個類,必須把抽象類中的抽象方法重寫。
7.例項:(程式碼展示)
static void Main(string[] args)
{
//抽象方法是用abstract修飾;
//抽象方法沒有方法體
//抽象方法必須在抽象類中
//抽象類無法例項化
//抽象類中的抽象方法是給子類寫的,它自己用不了
//父類是抽象類,子類繼承了這個類,必須把抽象類中的抽象方法重寫
Chinses china = new Chinses ();
china .Speak ();
Console .ReadKey ();
}
}
public abstract class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public abstract void Speak();
}
public class Chinses:Person
{
public override void Speak()
{
Console.WriteLine("漢語");//重寫了父類中的抽象方法
}
四、介面實現:
介面使用 interface 關鍵字宣告,它與類的宣告類似。介面宣告預設是 public 的。通常介面命令以 I 字母開頭。
1.介面不能直接例項化。
2.介面可以多實現,但是類只能單繼承。
3.類定義可以在不同的原始檔之間進行拆分 介面則不可以。
4.介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員。
5.介面可以實現介面。
6.例項:(程式碼展示)
static void Main(string[] args)
{
//這裡的IFly既不是父類又不是主類,為什麼能New出student?
//其實原因就在與Student實現了IFly這個介面
//其實這個也是多型的一種體現形式(非常高階的內容)
//介面不能直接例項化
//介面可以多實現,但是類只能單繼承
//類定義可以在不同的原始檔之間進行拆分 介面則不可以
//介面、類、結構都可以從多個介面繼承
//介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員
//介面可以實現介面
IFly ifly = new Student();
ifly.IFly();
Console.ReadKey();
}
}
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set {_gender = value ;}
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public void Say()
{
Console.WriteLine("Hello");
}
}
public class Teacher:Person,IFly //既有繼承又有介面的情況
{
public void Say()
{
Console.WriteLine("我是老師");
}
public void IFly()//實現介面,這裡的內容不可以省略,既然用就必須實現,不可以空缺
{
Console.WriteLine("我會飛");
}
void IFly.IFly()//顯示實現介面
{
Console.WriteLine("我也會飛");
}
}
public class Student:IFly //介面叫實現不叫繼承
{
public void SayHello()
{
Console.WriteLine("我是學生");
}
public void IFly()
{
Console.WriteLine("我會飛");
}
五、總結:
當然就我目前水平認識的多型還遠遠不夠,有很多的知識還隱藏在其後,需要我們不斷的總結和實踐方能見到其真相。本文中
如有不恰當之處,還望指出。本人不甚感激。