1. 程式人生 > >C# 面向物件:類、根據不同操作符操作兩個變數

C# 面向物件:類、根據不同操作符操作兩個變數

1、當使用類時,應新增一個新類

2、類名首字母需大寫

3、欄位用來儲存資料,private;屬性用來保護欄位;介面、建構函式、方法

        public struct1
        {              // 自動屬性:雖然沒有寫欄位,但是還是會生成欄位
            get;
            set;
         }

4、類寫好後,需要建立物件: Classes cl=new  Classes( );   // Classes是自定義的類名

      new關鍵字的作用:1、在堆中開闢空間 2、在開闢空間中建立物件  3、呼叫物件的建構函式(建構函式必須為public,初始化物件)

5、static、  抽象類不可以建立物件;

     在類中  this.name   ,this指當前類的物件(如下面程式碼)

6、靜態類的成員被修飾時,呼叫類名.靜態成員名  ;非靜態呼叫:物件名.非靜態成員名  /  物件名.例項成員

    This 的用法:

    第一個用法:

        public void print()
        {
            string name = "vivi";
            Console.WriteLine("{0}",this.name);  // 在這個函式中,本來是列印物件的name,如果不加this進行限定的話,直接列印的為變數的值。
        }

     第二個用法:

     呼叫自己的建構函式

     public class  void initial(int n1,int n2,int n3,int n4 ,int n5)
       {
            this.N1=n1;
            this.N2=n2;
            this.N3=n3;
            this.N4=n4;
            this.N5=n5;
        }
        public class void initial(int n1,int n2,int n3)
            :this(n1,n2,n3,0,0)  // 呼叫自己全參的建構函式 
       { 

        }

7、繼承單一性、傳遞性;介面可以有多個繼承;子類沒法繼承父類的欄位(private),子類沒有繼承父類的建構函式,而是預設會呼叫父類按個無引數的構      造函式,若父類的建構函式重寫了,自動替換掉父類的無引數的預設建構函式,子類無法呼叫父類的預設無引數的建構函式,出現異常,需要子類重新寫一個建構函式。子類先建立一個父類物件,在子類中呼叫父類的建構函式,使用base()

      繼承:方法

8、子類可以複製給父類;如果父類裝的是子類,可以將父類轉換為子類;

      如果兩個類有繼承關係,子類既可以使用自己的成員,也可以使用從父類繼承的成員。但是父類永遠只能使用自己的成員。 

      子類之間也不能相互使用對方的成員。

         public  class student:person 
          {  }
         person  ps=new student();  //ps表現的是父類的型別,裝的是子類的物件。-- 父類。
         student st=(student)person;
         或者使用as來轉換:
         stduent st1 = ps as student;// 使用as來轉換的話,轉換成功,返回轉換後的物件;轉換失敗,返回null。
         或者使用is做判斷
         if( ps is student) {  }  // 如果可以轉換,返回true;否則返回false
         object類是所有類的父類。

9、虛方法和抽象類

      如果父類有意義,可以建立方法進行呼叫。可以使用virtual;

      如果父類不知道方法如何實現,可使用抽象類abstract;

      虛擬成員或抽象成員不能是私有的。

      以前都是面向過程,現在是面向物件--類;

例子:實現根據不同操作符計算兩個int的操作;// 本處用兩個int型;

1、Program.cs
namespace calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立一個面向物件的,兩個數字的運算;
            Console.WriteLine("請輸入要計算的第一個數字");
            int num1=Convert.ToInt32(Console.ReadLine ());
            Console.WriteLine("請輸入要計算的第二個數字");
            int num2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("請輸入運算子");
            string oper =Console.ReadLine ();

            // 根據運算子不同,決定怎麼計算         
            CalFather cf = Decise(oper,num1,num2);
            double r = cf.GetResult();
            Console.WriteLine("計算結果為{0}",r);
            Console.ReadKey();
        }

        public static CalFather Decise(string oper,int num1,int num2)  // static 需要引用類名使用;非static的話,需要在這裡建立program類(所在的類),再引用
        {
            CalFather calf=null;
            switch(oper){
                case "+":
                    calf = new PlusCal(num1,num2);
                    break;
                case "-":
                    calf = new MinuCal(num1,num2);
                    break;
                case "*":
                    calf = new MultiCal(num1,num2);
                    break;
                case "/":
                    calf = new DivCal(num1,num2);
                    break;
                default:
                    Console.WriteLine("請輸入正確的操作符");
                    break;
            }
            return calf;
        } 
    }
}

2、CalFather.cs
namespace calculator
{
    public abstract class CalFather
    {
        public int Number1
        {
            get;
            set;
        }
        public int Number2
        {
            get;
            set;
        }
        public CalFather(int N1, int N2)
        {
            this.Number1 = N1;
            this.Number2 = N2;
        }
 
        public abstract  double GetResult(); 
    }
}

3、PlusCal.cs
namespace calculator
{
    public class PlusCal : CalFather
    {
        public  PlusCal(int n1, int n2)
            :base(n1,n2)
        {
 
        } 
            
       public  override double GetResult() //重寫父類的抽象方法
        {
            double res;
            res = this.Number1 + this.Number2;
            return res;
        }
    }
}

4、MinuCal.cs
namespace calculator
{
   public class MinuCal:CalFather 
    {
       public  MinuCal(int m1,int m2)
           :base(m1,m2){
       
     }
       public override double GetResult()
       {
           return this.Number1 - this.Number2;
       }
    }
}

5、MultiCal.cs
namespace calculator
{
    public class MultiCal : CalFather
    {
        public MultiCal(int n1,int n2) : base(n1,n2) { }
        public override double GetResult()
        {
            return this.Number1 * this.Number2;
        }
    }
}

6、DivCal.cs
namespace calculator
{
    public class DivCal : CalFather
    {
        public DivCal(int n1,int n2) : base(n1,n2) { }
        public override double GetResult()
        {
            return this.Number1 / this.Number2;
        }
    }
}