02 物件導向(以C#為例) - wycmaker/MVC-learning GitHub Wiki

簡介

物件導向程式設計(OOP)是一種具有物件概念的程式程式設計典範,類別是物件的藍圖,它可能包含資料、屬性、方法等。物件則指的是類別的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。通常將程式切割為一個個小物件,透過各個物件的連結,達到程式所要的執行動作,就像是由一個個零件組合成一個機器。

  • 範例-以類別為例
    public class Student
    {
        public string StudentName;
        public int StudentAge;
        public string StudentGender;

        public Student(string Name, int Age, string Gender)
        {
            StudentName = Name;
            StudentAge = Age;
            StudentGender = Gender;
        }

        public void GetName()
        {
            Console.WriteLine("我的名字是{0}", StudentName);
        }
    } 

上面的類別定義了學生的姓名、年齡等欄位,以及GetName()方法,是一個學生物件的藍圖,要用以下的程式法來將物件實例化

    Student S1 = new Student("Jack", 20, "男");
    S1.GetName();

類別中定義了建構函式Student,可以方便我們建立物件,經過new建立一個為S1的物件,就可以使用Student類別中定義的方法

Ex:沒有定義建構函式系統會自行產生,但在建立物件的過程必須拆分成好幾行

    Student S1 = new Student();
    S1.StudentName = "Jack";
    S1.StudentAge = 20;
    S1.StudentGender = "男";
    S1.GetName();
  • 範例-static變數
    public class Student
    {
        public string StudentName;
        public int StudentAge;
        public string StudentGender;
        public static int StudentCredit;

        public Student(string Name, int Age, string Gender)
        {
            StudentName = Name;
            StudentAge = Age;
            StudentGender = Gender;
        }

        public void SetCredit(int Credit)
        {
            StudentCredit = Credit;
        }

        public void GetCredit()
        {
            Console.WriteLine("{0}的學分是{1}", this.StudentName, StudentCredit);
        }

    }

呼叫

    Student S1 = new Student("Jack", 20, "男");
    S1.SetCredit(30);
    Console.WriteLine("第一位學生");
    S1.GetCredit();

    Student S2 = new Student("Merry", 20, "女");
    S2.SetCredit(40);
    Console.WriteLine("第二位學生");
    S2.GetCredit();
    Console.WriteLine("第一位學生");
    S1.GetCredit();
    Console.Read();

執行結果

第一位學生
Jack的學分是30
第二位學生
Merry的學分是40
第一位學生
Jack的學分是40

上面的範例可以看出宣告為static的變數在系統中只存在一份,所以在設定完Merry的學分後,連Jack的學分也跟著一起改變,所以在使用靜態變數上必須特別小心

物件導向的三大特性

  1. 封裝

將類別內部的資料隱藏起來,讓使用者只能透過建立物件才能取得類別內部的屬性或方法,若不經過類別提供的方法則無法更改類別內部的資料。就像我們看一個物品,只要了解它怎麼用,而不用去研究它是如何做出來的。

  1. 繼承

一個類別要引用其他類別可以使用繼承的方式,被繼承的類別稱為「父類別」或「基底類別」,繼承的類別則稱為「子類別」,通常子類別比父類別更加具體化,不只繼承父類別的屬性與方法,也有自己獨有的屬性及方法

範例-繼承

    public class Animal
    {
        public string Spices;
        public int Age;
    } 

    public class Cat:Animal
    {
        public int FootNumber;

        public Cat(string spices, int age, int footnumber)
        {
            Spices = spices;
            Age = age;
            FootNumber = footnumber;
        }
    }

    public class Dog:Animal
    {
        public string Color;

        public Dog(string spices, int age, string color)
        {
            Spices = spices;
            Age = age;
            Color = color;
        }
    }

類別Cat與Dog都繼承至Animal類別,所以有共同的物種與年齡欄位,而Cat類別有自己的footnumber欄位,Dog類別有自己的color欄位,這個就是繼承的特點,可以擁有父類別的欄位與方法加上自己獨有的欄位或方法形成一個新的更詳細的類別

  1. 多型 - 多型指的是相同名稱的方法,當傳入不同的參數會執行部一樣的敘述,其中包刮多載與複寫。

多載指的是相同名稱的函數有不同個數的參數或不同型態的參數傳入,執行不一樣的敘述

範例-多載(Overloading)

    public class Area
    {
        public double radis;
        public double width;
        public double height;

        public double GetArea(int radis)
        {
            return radis * radis;
        }

        public double GetArea(double width, double height)
        {
            return width * height;
        }
    }

複寫則是由子類別覆蓋掉父類別中的方法

範例-複寫(Overriding)

    public class Area
    {
        public double radis;
        public double width;
        public double height;

        public virtual double GetArea()
        {
            return this.radis * this.radis;
        }

    }

    public class Circle:Area
    {
        public const double PI = 3.14;

        public override double GetArea()
        {
            return base.GetArea()*3.14;
        }
    }

參考資料

維基百科:https://zh.wikipedia.org/wiki/面向对象程序设计

物件導向程式設計基礎觀念:http://glj8989332.blogspot.com/2017/11/design-pattern-oop.html

書籍: Vistual C# 2017 程式設計