前言: 完全是我在學習過程中記錄的筆記,只不過分享一下讓很多剛開始學習.net編程的人能夠很快的學會C#語言
- 多態的一些說明
?(1) 多態就是為了程序的可擴展性
?(2)多態的使用:將不同的對象當作父類來看,屏蔽掉各個對象間的不同,寫出通用代碼,做出通用編程,同樣調用不同結果,以適應需求的不斷變化
?(3)ToString方法有Object提供,使得所有的類型均可以使用Console.WriteLine()方法
??????????? class Person
??????????? {
?????????????????? public string Name { get; set; }
?????????????????? public int Age { get; set; }
?????????????????? //當寫第三個的時候寫入下面的方法
?????????????????? public override string ToString()
?????????????????? {
????????????????????????? return Name;
?????????????????? }
??????????? }
??????????? class Program
??????????? {
?????????????????? static void Main(string[] args)
?????????????????? {
????????????????????????? int[] nums = { 1, 34, 4, 65, 7, 87, 454 };
????????????????????????? Console.WriteLine(nums);
????????????????????????? //輸出:System.Int32[]
????????????????????????? //準備對象
????????????????????????? Person p = new Person();
????????????????????????? p.Name = "韓迎龍";
????????????????????????? p.Age = 19;
????????????????????????? Console.WriteLine(p);
????????????????????????? //輸出:智能機器.Person
????????????????????????? //第三個
????????????????????????? Person p1 = new Person();
????????????????????????? p1.Name = "韓迎龍";
????????????????????????? p1.Age = 19;
????????????????????????? Console.WriteLine(p);
????????????????????????? //輸出張三
????????????????????????? Console.ReadKey();
?????????????????? }
??????????? }
?(4)多態的保障
??????????? 1)繼承,相同名字的方法(重載不算)
??????????? 2)里氏轉換原則
?(5)is和as
??????????? 1)判斷父類繼承
??????????? 2)判斷接口實現
??????????? 3)判斷拆箱和裝箱
2.多態實現計算器
(1) 新建一個控制臺應用程序,起名為多態計算器(2)添加一個CalculstingWay類,表示計算的方法/// <summary>/// 計算機的計算/// </summary>class CalculstingWay{int num1;int num2;public int Num1{get { return num1; }set { num1 = value; }}public int Num2{get { return num2; }set { num2 = value; }}public CalculstingWay(int n1, int n2){num1 = n1;num2 = n2;}public virtual int Calculating(){//這個方法是需要子類重寫的return 0;}}(3)添加一個Add類,表示實現加法的計算/// <summary>/// 提供加法計算的方法/// </summary>class Add:CalculstingWay{public Add(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 + base.Num2;}} (4)添加一個Sub類,表示實現減法的計算/// <summary>/// 提供減法計算的方法/// </summary>class Sub : CalculstingWay{public Sub(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 - base.Num2;}} (5)添加一個Multi類,表示實現乘法的計算/// <summary>/// 提供乘法計算的方法/// </summary>class Multi : CalculstingWay{public Multi(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 + base.Num2;}} (6)添加一個Div類,表示實現除法的計算/// <summary>/// 提供除法計算的方法/// </summary>class Div : CalculstingWay{public Div(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 + base.Num2;}}
(7)添加一個Calculator類,表示計算器類/// <summary>/// 表示計算器/// </summary>class Calculator{//可以進行計算的對象CalculstingWay cal;public Calculator(int num1, int num2, string oper){switch (oper){case "+":cal = new Add(num1, num2);break;case "-":cal = new Sub(num1, num2);break;case "*":cal = new Multi(num1, num2);break;case "/":cal = new Div(num1, num2);break;default:cal = null;break;}}public int jisuan(){if (cal != null){return cal.Calculating();}else{return -1;}}}
3.?抽象方法
?(1) 父類提供一個可以被重寫的方法,有子類重寫,通過父類,new子類來調用
?(2)父類不需要方法體
?(3)語法:[public] abstract 返回類型 方法名(參數);
?????????????????? 和方法相比有以下幾點需要注意的:
?????????????????? 1)去掉方法體,直接在圓括號結束的時候加分號
?????????????????? 2)加上abstract進行修飾
?(4)抽象方法只允許在抽象類中存在
??????????? 1)只要在class關鍵字前面用abstract修飾即可
?????????????????? abstract class 類名
?????????????????? {
????????????????????????? //成員
?????????????????? }
(5)抽象方法,抽象類就是為了被子類繼承,重寫的
abstract class Animal{public abstract void Shout();}class Dog : Animal{public override void Shout(){Console.WriteLine("財旺福王運道旺");}}class Cat : Animal{public override void Shout(){Console.WriteLine("喵喵喵");}}class Program{static void Main(string[] args){Animal[] animals = {new Dog(),new Cat() };for (int i = 0; i < animals.Length; i++){animals[i].Shout();}Console.ReadKey();}}
?(6)抽象方法的細節
??????????? 1)抽象類中可以包含什么東西?
?????????????????? ->比一般類多了抽象成員
?????????????????? ->抽象成員有有什么:方法,屬性,索引器,事件聲明
??????????? 2)抽象類不允許實例化,不能new
??????????? 3)抽象類可以有構造方法
??????????? 4)抽象類可以來源于非抽象類
?????????????????? class MyBase
?????????????????? {
?????????????????? }
?????????????????? abstract class Test : MyBase
?????????????????? {
????????????????????????? public abstract void Func();
?????????????????? }
?????????????????? class MySub : Test
?????????????????? {
????????????????????????? public override void Func()
????????????????????????? {
???????????????????????????????? Console.WriteLine("抽象類可以來源于非抽象類");
????????????????????????? }
?????????????????? }
??????????? 5)抽象類必須被子類重寫,除非子類也是抽象的
?(7)練習:有一個形狀Shape類,派生出圓Circle,矩形Rectangle和正方形Square,分別計算他們的面積Area和周長Perimeter?
1)新建一個控制臺項目:起名為多態小案例2)添加一個Shape類,實現計算面積和周長的方法abstract class Shape{public abstract double GetArea();public abstract double GetPerimeter();}3)添加一個Circle類,實現計算圓的面積和周長class Circle : Shape{int r;public Circle(int r){this.r = r;}public override double GetArea(){return Math.PI * Math.Pow(r, 2);}public override double GetPerimeter(){return 2 * Math.PI * r;}}4)添加一個類,實現計算矩形的面積和周長class Rectangle : Shape{double widthX;double heightY;public Rectangle(double widthX, double heightY){this.widthX = widthX;this.heightY = heightY;}public override double GetArea(){return widthX * heightY;}public override double GetPerimeter(){return 2 * (widthX + heightY);}}5)添加一個類,實現計算正方形的面積和周長class Square : Shape{double length;public Square(double length){this.length = length;}public override double GetArea(){return Math.Pow(length, 2);}public override double GetPerimeter(){return 4 * length;}}class Square1 : Rectangle{public Square1(double length): base(length, length){}}6)在Main方法中實現的代碼如下:class Program{static void Main(string[] args){Circle circle = new Circle(5);Console.WriteLine(circle.GetArea().ToString("0.00"));Console.WriteLine(circle.GetPerimeter().ToString("0.00"));Rectangle rec = new Rectangle(5, 10);Console.WriteLine(rec.GetArea());Console.WriteLine(rec.GetPerimeter());Square square = new Square(5);Console.WriteLine(square.GetArea());Console.WriteLine(square.GetPerimeter());Square1 sqr = new Square1(5);Console.WriteLine(sqr.GetArea());Console.WriteLine(sqr.GetPerimeter());}}
?(8)抽象屬性
??????????? 1)使用abstract修飾
??????????? 2)去掉方法體
??????????? 3)語法:public abstract 返回類型 屬性
????????????????????????? {
???????????????????????????????? get;
???????????????????????????????? set;
????????????????????????? }
??????????? 4)自動屬性必須包含get,set方法
??????????? 5)抽象屬性可以定義只讀,只寫,
?(9)由子類實現抽象屬性的方法
??????????? 1)用override重寫屬性
??????????? 2)添加一個字段,使用屬性
- 面向對象計算器(簡單工廠計算器)
(1) 新建一個控制臺應用程序,起名為:簡單工廠計算器(最好寫成英文的,我是為了學習直接寫成中文的了) (2)新建一個CalculatingWay類,實現計算機的父類計算/// <summary>/// 計算機的計算/// </summary>abstract class CalculstingWay{int num1;int num2;public int Num1{get { return num1; }set { num1 = value; }}public int Num2{get { return num2; }set { num2 = value; }}public CalculstingWay(int n1, int n2){num1 = n1;num2 = n2;}public abstract int Calculating();}(3)新建一個Add類,/// <summary>/// 提供加法計算的方法/// </summary>class Add:CalculstingWay{public Add(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 + base.Num2;}}(4)新建一個Sub類,/// <summary>/// 提供減法計算的方法/// </summary>class Sub : CalculstingWay{public Sub(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 - base.Num2;}}(5)新建一個Multi類,/// <summary>/// 提供乘法計算的方法/// </summary>class Multi : CalculstingWay{public Multi(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 + base.Num2;}} (6)新建一個Div類,/// <summary>/// 提供除法計算的方法/// </summary>class Div : CalculstingWay{public Div(int n1, int n2): base(n1, n2){}public override int Calculating(){return base.Num1 + base.Num2;}} (7)新建一個Factory類static class Factory{public static CalculstingWay GetCalculator(int n1,int n2,string oper){switch (oper){case "+":return new Add(n1, n2);case "-":return new Sub(n1, n2);case "*":return new Multi(n1, n2);case "/":return new Div(n1, n2);default:return null;}}} (8)在Main方法中寫入如下這段代碼:class Program{static void Main(string[] args){//提示用戶輸入Console.Write("請用戶輸入第一個數字:");int num1 = GetInputNum();Console.Write("請用戶輸入第一個數字:");int num2 = GetInputNum();Console.Write("請輸入運算符");string oper = Console.ReadLine();//開始生產CalculstingWay cal = Factory.GetCalculator(num1, num2, oper);//開始投入使用if (cal != null){int res = cal.Calculating();Console.WriteLine("{0}{1}{2}={3}", num1, oper, num2, res);}else{Console.WriteLine("運算符有誤");}}public static int GetInputNum(){return GetInputNum(int.MinValue, int.MaxValue);}/// <summary>/// 完成int類型數據的輸入,并返回,要求輸入的數字在0到給定的數字之間/// </summary>/// <param name="max">給定的數字的上限</param>/// <returns></returns>public static int GetInputNum(int max){return GetInputNum(0, max);}/// <summary>/// 完成int數字的輸入,要求在給定范圍之間/// </summary>/// <param name="min">給定范圍的下線</param>/// <param name="max">給定范圍的上線</param>/// <returns></returns>public static int GetInputNum(int min, int max){string str = Console.ReadLine();int num;while (true){try{num = Convert.ToInt32(str);if (num > min && num < max){break;}Console.Write("輸入數字不再{0}到{1}之間,請重新輸入", min, max);str = Console.ReadLine();}catch{Console.Write("輸入有誤,請重新輸入");str = Console.ReadLine();}}return num;}}