您好,登錄后才能下訂單哦!
這篇文章主要介紹了C#中多態(tài)性學習/虛方法/抽象方法和接口怎么使用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#中多態(tài)性學習/虛方法/抽象方法和接口怎么使用文章都會有所收獲,下面我們一起來看看吧。
C#中的多態(tài)性是OOP(面向?qū)ο缶幊蹋┑囊粋€基本概念,它允許一個對象在不同情況下表現(xiàn)出不同的行為,以增強代碼的可重用性和靈活性。
根據(jù)網(wǎng)上的教程,我們得知C#多態(tài)性分為兩類,靜態(tài)和動態(tài)。但實際上,C#沒有嚴格的靜態(tài)和動態(tài)多態(tài)性的分法。之所以這么分,還是為了我們便于理解,我們沿用這個思維來大概分類:
采用函數(shù)重載或運算符重載方法的,屬于靜態(tài)多態(tài)性;
采用虛方法、抽象方法、接口等方式,屬于動態(tài)多態(tài)性。
拓展:
在靜態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在編譯時發(fā)生的。在動態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在運行時發(fā)生的。什么意思呢?
在靜態(tài)語言中,許多多態(tài)性的特性可以在編譯時確定,編譯器可以根據(jù)數(shù)據(jù)類型的信息來確定方法的調(diào)用方式。
而在動態(tài)語言中,數(shù)據(jù)類型的確定通常是在運行時進行的,這種行為被稱為動態(tài)多態(tài)性。
函數(shù)重載是指在同一個類中,定義多個方法,它們的方法名相同,但是參數(shù)類型、參數(shù)數(shù)量、參數(shù)順序不同。以下是一個函數(shù)重載的例子:
public class Calculator { public int Add(int a, int b) { return a + b; } public int Add(int a, int b, int c) { return a + b + c; } public float Add(float a, float b) { return a + b; } public double Add(double a, double b) { return a + b; } }
在這個例子中,Calculator類定義了4個Add()方法,它們的方法名相同但是參數(shù)列表不同(分別有2個整型參數(shù)、3個整型參數(shù)、2個浮點型參數(shù)、2個雙精度浮點型參數(shù))。這些方法根據(jù)聲明的參數(shù)類型和數(shù)量而得到不同的簽名,因此構(gòu)成函數(shù)重載,當調(diào)用Add()方法時,編譯器會根據(jù)參數(shù)的類型和數(shù)量來選擇正確的方法重載進行調(diào)用。
虛方法和重寫(override)方法:在父類中聲明一個虛方法,子類可以重寫該方法并實現(xiàn)自己的行為。在運行時,程序根據(jù)對象的實際類型調(diào)用相應(yīng)的方法。這種方式也稱為“消除靜態(tài)綁定”。
注意事項:虛方法是使用關(guān)鍵字 virtual 聲明的。同時繼承類中的重寫虛函數(shù)需要聲明關(guān)鍵字 override 。下面是一個示例:
// 定義一個Animal類和其子類 class Animal { public virtual void Speak() { Console.WriteLine("I am an animal."); } } class Dog : Animal { public override void Speak() { Console.WriteLine("Woof!"); } } class Cat : Animal { public override void Speak() { Console.WriteLine("Meow!"); } } // 示例程序 class Program { static void Main(string[] args) { Animal[] animals = new Animal[2]; animals[0] = new Dog(); animals[1] = new Cat(); foreach (Animal animal in animals) { animal.Speak(); } Console.ReadKey(); } }
在這個例子中,Animal類中聲明了一個虛方法Speak(),它的子類 Dog 和 Cat 分別對該方法進行了重寫。在Main 方法中,創(chuàng)建了一個 Animal 數(shù)組,其中存放了 Dog 和 Cat 的實例。在foreach循環(huán)中,程序根據(jù)實際對象類型調(diào)用了不同的Speak()方法,實現(xiàn)了多態(tài)性的效果。
小拓展:關(guān)鍵字重寫 override 與覆蓋 new 較為容易搞混,有關(guān)兩者區(qū)別可移步:C#中重寫(override)及覆蓋(new)的區(qū)別詳解。
抽象方法是在抽象類中定義的,它沒有具體實現(xiàn)的代碼,而只是定義了方法的名稱、參數(shù)和返回值類型等信息。抽象方法必須在子類中進行完整的實現(xiàn),否則子類本身也必須定義為抽象類。使用abstract關(guān)鍵字來定義抽象類和抽象方法。
下面的示例演示了如何定義并使用抽象方法:
abstract class Shape { public abstract double Area(); // 定義抽象方法Area() } // 派生類Rectangle繼承抽象類Shape class Rectangle : Shape { double width, height; public Rectangle(double w, double h) { width = w; height = h; } public override double Area() // 實現(xiàn)抽象方法Area() { return width * height; } } class Triangle : Shape { double baseValue, height; public Triangle(double bv, double h) { baseValue = bv; height = h; } public override double Area() // 實現(xiàn)抽象方法Area() { return baseValue * height * 0.5; } } class Program { static void Main(string[] args) { Rectangle r = new Rectangle(5, 8); Console.WriteLine("矩形的面積 = {0}", r.Area()); Triangle t = new Triangle(5, 8); Console.WriteLine("三角形的面積 = {0}", t.Area()); } }
上面的代碼定義了Shape類和兩個派生類Rectangle和Triangle。Shape類中定義了一個抽象方法Area(),并在Rectangle和Triangle中實現(xiàn)了這個抽象方法。在Main方法中,創(chuàng)建了一個Rectangle對象 r 和一個Triangle對象 t,并分別調(diào)用它們的Area()方法計算出它們的面積。
C#接口是一種約定,是一個抽象的類型,它定義了一組公共的方法、屬性、索引器和事件,這些成員沒有實現(xiàn)細節(jié)和實現(xiàn)代碼,只定義了接口的行為。
定義接口的語法如下:
interface 接口名稱
{
方法1
方法2
屬性1
索引器1
事件1
}
其中,方法、屬性、索引器和事件都是接口的成員,它們都沒有實現(xiàn),只是定義了行為的名稱和參數(shù)。
方法定義的語法如下:返回類型 方法名稱(參數(shù)列表);
屬性定義的語法如下:屬性類型 屬性名稱 { get; set; }
索引器定義的語法如下:索引器類型 this[索引器參數(shù)] { get; set; }
事件定義的語法如下:event 事件委托類型 事件名稱;
其中,事件委托類型是一個Delegate類型。
定義一個接口之后,可以通過繼承或?qū)崿F(xiàn)來使用接口。接口的繼承使用“:”符號,需要注意的是,如果一個類實現(xiàn)了一個接口,那么它必須實現(xiàn)接口中所有的方法和屬性。下面是接口示例:
interface IShape { double Perimeter(); double Area(); } interface ICircle : IShape { double Radius { get; set; } } interface IRectangle : IShape { double Width { get; set; } double Height { get; set; } } class Circle : ICircle { public double Radius { get; set; } public double Perimeter() { return 2 * Math.PI * Radius; } public double Area() { return Math.PI * Radius * Radius; } } class Rectangle : IRectangle { public double Width { get; set; } public double Height { get; set; } public double Perimeter() { return 2 * (Width + Height); } public double Area() { return Width * Height; } } class Program { static void Main(string[] args) { Circle c = new Circle(); c.Radius = 1; Console.WriteLine("Circle: Perimeter = {0}, Area = {1}", c.Perimeter(), c.Area()); Rectangle r = new Rectangle(); r.Width = 2; r.Height = 3; Console.WriteLine("Rectangle: Perimeter = {0}, Area = {1}", r.Perimeter(), r.Area()); } }
上面的代碼定義了IShape、ICircle和IRectangle三個接口、以及Circle和Rectangle兩個類。其中,Circle類實現(xiàn)了ICircle接口,Rectangle類實現(xiàn)了IRectangle接口。在Main方法中,創(chuàng)建了一個Circle對象和一個Rectangle對象,并給它們的屬性賦值。然后分別調(diào)用了Circle和Rectangle對象的Perimeter()和Area()方法輸出結(jié)果。
運行程序,輸出以下結(jié)果:
Circle: Perimeter = 6.28318530717959, Area = 3.14159265358979
Rectangle: Perimeter = 10, Area = 6
可以看到,通過使用接口,我們可以很方便地定義出不同的形狀,然后計算出它們的周長和面積。這就展示了接口在C#編程中的重要地位。
關(guān)于“C#中多態(tài)性學習/虛方法/抽象方法和接口怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C#中多態(tài)性學習/虛方法/抽象方法和接口怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。