C#面向對象的核心概念


一、面向對象的核心概念

(一)抽象——面向對象的根基

講到抽象,不得不涉及到現代科學技術的基礎——數學。

數學是一門抽象的科學,面對着紛繁復雜的世間萬物,數學不理會各種事物的獨特特性,而只抽取它們在數量上的特性,深刻揭示了“世間萬物”在數量上表現出的共同規律,抽象正是數學的本質特征。

數學的一個分支——離散數學是計算機科學的根基之一,因此,計算機科學從誕生之日起,就與數學有着密不可分的聯系,抽象思維也是計算機科學的主要思維方法之一。

在使用面向對象的方法設計一個軟件系統時,首先就要區分出現實世界中的事物所屬的類型,分析它們擁有哪些性質與功能,再將它們抽象為在計算機虛擬世界中才有意義的實體——類,在程序運行時,由類創建出對象,用對象之間的相互合作關系來模擬真實世界中事物的相互關聯。

在從真實世界到計算機虛擬世界的轉換過程中,抽象起了關鍵的作用。

(二)面向對象的三大基本特性

1.封裝

封裝的類=數據+對此數據所進行的操作(即算法)

通俗的說,封裝就是:包起外界不必需要知道的東西,只向外界展露可供展示的東西。

2.繼承

真實世界中,事物之間有着一種派生關系,比如“食品”這一大類中包括“水果”這一子類,而“蘋果”又包含在“水果”這一子類中。

在計算機世界中,以面向對象的觀點不僅將上述事物抽象為類,而且將事物之間的派生關系也一並模擬出來,這種關系稱為“繼承”。

在面向對象軟件系統中,繼承除了模擬現實世界中事物關系這一作用,還是一個“重用已有代碼而又不破壞已有代碼”的方法。

3.多態

在代碼中本應使用某一具體子類的地方使用較為抽象的基類對象,這種方法所帶來的好處是多態的代碼具有“變色龍”的特性,即在不同的條件下,同樣代碼可以完成不同的功能。

二、類與對象

(一)類是面向對象編程的基本單元。

(二)字段即變量,方法即函數。

函數分為變量函數(字段的保護),行為函數。

實例方法:對象可以調用,類不能調用。

方法的重載:1.同名2.參數類型不同或個數不同

(三)傳值與傳址

傳值引用:整形變量,浮點型變量,結構體,日期時間(存儲在棧空間)

傳址引用:字符串,數組,類。(存儲在堆空間)

f

例題:小狗——類的傳址引用

class dog
    {
        public string name;
        public void bark()
        {
            Console.WriteLine("汪汪,我的名字叫"+name);
        }
    }

 static void Main(string[] args)
        {
            dog a = new dog();
            dog b = new dog();

            a.name = "旺財";
            b.name = "守家";
            a.bark();
            b.bark();

            //將a的引用地址復制給c,a和c將同時控制同一個對象;
            //c將對象屬性改變后,a指向的也是一個改變后的對象。
            dog c = a;           
            c.name = "大黃";
            a.bark();

            //將b的引用地址復制給a和c,a、b、c、控制同一個對象;
            //a、b原來指向的對象沒有地址指向它,無法被調用,稱為垃圾。
            a = b;
            c = b;              
            a.bark();
            b.bark();
            c.bark();

a

 

例題:用oop解決泳池問題

//創建圓的類
 class circle
    {
        public double r;
        public double getLength()
        {
            double l = 2 * 3.14 * r;
            return l;
        }
        public double getArea()
        {
            double s = 3.14 * r * r;
            return s;
        }
    }

 //求游泳池的周長和廣場面積
        static void Main(string[] args)
        {
            circle small = new circle();
            circle big = new circle();
            Console.Write("請輸入小圓半徑");
            small.r=Convert.ToInt32(Console.ReadLine());
            Console.Write("請輸入大圓半徑");
            big.r = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("泳池周長:"+small.getLength());
            Console.WriteLine("廣場面積:"+(big.getArea()-small.getArea()));

        }

b

例題:狗咬狗——方法的重載

class dog
    {
        public string name;
        public int HP = 100;
        public void bark()
        {
            Console.WriteLine("汪汪,我的名字叫" + name);
        }
        public void bite(dog op)
        {
            Console.WriteLine(name + "開始攻擊" + op.name);
            op.HP -= 10;
            Console.WriteLine(name + "的血量:" + HP + "\n" + op.name + "的血量:" + op.HP);

        }

    }

 class people
    {
        public string name;
        public void attackDog(dog op)
        {
            op.HP -= 10;
            Console.WriteLine(name+"開始打狗\n"+op.name+"的血量:"+op.HP);
        }
        public void attackDog(dog op, int blood)
        {
            op.HP -= blood;
            Console.WriteLine(name+"開始打狗\n"+op.name+"的血量:"+op.HP);
        }
    }

  static void Main(string[] args)
        {
            //狗咬狗
            dog a = new dog();
            dog b = new dog();
            a.name = "旺財";
            b.name = "守家";
            a.bite(b);
            b.bite(a);
            //人打狗,函數的重載
            people h = new people();
            h.name = "秋香";
            h.attackDog(a);
            h.attackDog(a,15);
        }

c

例題:opp的字段保護——學生信息

class student
    {
        /*通過設置private,在本類之外無法直接操作該類的字段,
        必須通過調用該類的函數(稱為變量函數)來訪問,起到保護字段的作用*/
        public string name;
        private int height;
        private int weight;
        public void setHeight(int a)
        {
            if (a > 0 && a < 1000)
            {
                height = a;
            }
            else
            {
                Console.WriteLine("身高輸入不正確");
            }
        }

        public int getHeight()
        {
            return height;
        }

        public void setWeight(int a)
        {
            if (a > 0 && a <= 1000)
            {
                weight = a;
            }
            else
            {
                Console.WriteLine("體重輸入不正確");
            }
        }

        public int getWeight()
        {
            return weight;
        }

        public void speak()
        {
            Console.WriteLine("我叫"+name+";體重:"+weight+"千克。身高:"+height+"cm");
        }
    }


 static void Main(string[] args)
        {
            student a = new student();
            a.name = "王小明";
            a.setHeight(170);
            a.setWeight(80);

            a.speak();
        }

d


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM