C# 面向對象三年夜特征:封裝、繼續、多態。本站提示廣大學習愛好者:(C# 面向對象三年夜特征:封裝、繼續、多態)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 面向對象三年夜特征:封裝、繼續、多態正文
面向對象有封裝、繼續、多態這三個特征,面向對象編程依照實際世界的特色來治理龐雜的事物,把它們籠統為對象,具有本身的狀況和行動,經由過程抵消息的反響來完成義務。這類編程辦法供給了異常壯大的多樣性,年夜年夜增長了代碼的重用機遇,增長了法式開辟的速度,將具有自力性特制的法式代碼包裝起來,修正部門法式代碼時不至於會影響到法式的其他部門。
1.封裝
每一個對象都包括它停止操作所須要的一切信息,封裝只地下代碼單位的對外接口,而隱蔽其詳細完成,盡可能纰謬外地下代碼。應用封裝有許多利益,從設計角度來說,封裝可以對外屏障一些主要的信息,好比應用電腦的人只需曉得怎樣應用電腦便可以,不消曉得這些功效詳細是怎樣完成的;從平安性斟酌,封裝使對代碼的修正加倍平安和輕易,封裝明白的指出了哪些屬性和辦法是內部可以拜訪的,如許當須要調劑這個類的代碼時,只需包管私有屬性不變,私有辦法的參數和前往值類型不變,那末便可以縱情的修正這個類,而不會影響到法式的其他部門;封裝還防止了定名抵觸的成績,封裝有隔離感化,分歧的類中可以有雷同稱號的辦法和屬性,但不會混雜,也能夠削減耦合。
2.繼續
繼續可使用現有類的一切功效,並在不必從新編寫本來的類的情形下,對這些功效停止擴大。應用繼續而發生的類被稱為派生類或子類,而被繼續的類則稱為基類或超類或父類。繼續表現一個類型派生於一個基類型,它具有該基類型的一切成員字段和函數,其子類是對父類的擴大;接口繼續是表現一個類型只繼續了函數的簽名,沒有繼續任何完成代碼。繼續劃分了類的條理性,也能夠說繼續是對類的分組,父類代表的是籠統的類,更經常使用的類,而子類代表的是更加詳細,更加細化的類;繼續是完成代碼重用、擴大的主要手腕。所謂籠統的類是指與詳細的事項相接洽,但只是表達全體而不是詳細概念的類,好比說外形包括正方形、長方形、圓等,這時候候外形是一個籠統的概念,相當於一個父類,而正方形、長方形、圓是詳細的外形,相當因而子類。
3.多態
多態是指法式中同名的分歧辦法共存的情形,重要經由過程子類對父類辦法的籠罩來完成多態。如許,分歧類的對象可以用同名的辦法完成特定的功效,但詳細的完成辦法卻可以分歧。好比說外形包括正方形、長方形、圓等,每一個外形都有面積和周長,然則分歧的外形盤算面積和周長的辦法都分歧。
上面就舉個例子來講明封裝、繼續、多態:
這個例子的基類,就是下面描寫概念的時刻提到的外形,外形是基類,而這個基類是個籠統的概念,而不是詳細的,是以是籠統類,此類包括屬性外形稱號、輸入外形周長和面積的辦法和盤算外形周長和面積的籠統辦法:
/// <summary> /// 外形基類 /// </summary> public abstract class Shape { /// <summary> /// 外形稱號 /// </summary> public string ShapeName { get; private set; } public Shape(string shapeName) { ShapeName = shapeName; } /// <summary> /// 輸入外形周長 /// </summary> public virtual void PrintPerimeter(double perimeter) { Console.WriteLine(ShapeName + " Perimeter: " + perimeter); } /// <summary> /// 輸入外形面積 /// </summary> public virtual void PrintArea(double area) { Console.WriteLine(ShapeName + " Area: " + area); } /// <summary> /// 盤算外形周長 /// </summary> /// <returns></returns> public abstract double CalculatePerimeter(); /// <summary> /// 盤算外形面積 /// </summary> /// <returns></returns> public abstract double CalculateArea(); }
上面再來看詳細的子類,子類是圓,包括屬性半徑、盤算周長和面積的辦法:
/// <summary> /// 圓 /// </summary> public class Circle : Shape { /// <summary> /// 圓的半徑 /// </summary> public double R { get; set; } public Circle() : base("Circle") { this.R = 0; } /// <summary> /// 圓的周長 /// </summary> /// <returns></returns> public override double CalculatePerimeter() { return 2 * Math.PI * R; } /// <summary> /// 圓的面積 /// </summary> /// <returns></returns> public override double CalculateArea() { return Math.PI * R * R; } }
再來看看長方形,包括屬性高度和寬度、盤算周長和面積的辦法:
public class Rectangle : Shape { /// <summary> /// 長方形的長度 /// </summary> public double Width { get; set; } /// <summary> /// 長方形的高度 /// </summary> public double Height { get; set; } public Rectangle() : base("Rectangle") { Width = 0; Height = 0; } /// <summary> /// 長方形的周長 /// </summary> /// <returns></returns> public override double CalculatePerimeter() { return (Width + Height) * 2; } /// <summary> /// 長方形的面積 /// </summary> /// <returns></returns> public override double CalculateArea() { return Width * Height; } }
以下是挪用的代碼:
Circle circle = new Circle(); circle.R = 20; Square square = new Square(); square.Edge = 10; Rectangle rectangle = new Rectangle(); rectangle.Width = 20; rectangle.Height = 30; // 把子類賦給父類,能更好的表現多態性 IList<Shape> shapeList = new List<Shape>(); shapeList.Add(circle); shapeList.Add(square); shapeList.Add(rectangle); foreach (var shape in shapeList) { shape.PrintPerimeter(shape.CalculatePerimeter()); shape.PrintArea(shape.CalculateArea()); }
在此例子中,輸入外形的周長和面積的辦法沒有太年夜感化,是由於辦法的詳細完成比擬簡略,假如是龐雜的辦法時會有很年夜感化。好比說想要完成拖拽功效,每一個外形都是可以拖拽的,並且每一個外形拖拽的辦法都邑是一樣的,然則想要完成拖拽功效可不像輸入這麼簡略,這時候候子類可以繼續父類的辦法,直接挪用。