Andy's blog

If you always do what you've always done, you'll always get what you've always got.

0%

2020-11-09-物件導向1

今天來重新學一次物件導向概念。


參考資料:
ITHandyGuy Tutorial
物件導向(Object Oriented Programming)概念
小山的 C# 教學-第1課-C# 是甚麼?


何謂物件導向

簡單來說就是透過物件與物件之間的互動,來完成功能就是物件導向。
而組成物件導向,最基礎的兩個元素就是ClassObject
Class:就是用來定義抽象事務,可以有方法、屬性
Object: 物件就是類別的 Instance(實例)

1
2
3
4
5
6
7
8
9
10
11
12
13
// Class 類別
class Cat
{
int age;
string name;
}

Cat myCat; //產生一個Cat類別,名稱叫myCat,概念如int X
myCat = new myCat(); //賦予myCat一個記憶體空間,到這部就是物件(Object)



Cat myCat = new Cat(); //上述兩步驟縮寫法

物件導向特性

  1. 封裝性
  2. 繼承
  3. 多型

public protected private 三者差異

這三者差異主要在存取範圍上

  • public 就是未限制存取
  • protected 就是同一個 class 繼承也可以使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class car
    {
    protected int x = 111;
    }

    class B: car
    {
    var a = new A();
    var b = new B();
    b.x =11; //OK
    a.x =33; //Error CS1540,因為沒有繼承!
    }
  • private 最嚴格,只有相同類別下才能使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class car
    {
    private int x = 111;
    }

    class B: car
    {
    var a = new A();
    b.x =11; //indirectly accessed due to its protection level

    }

Class

  1. Class 就像一個藍圖,底下可以放方法、Field、屬性、建構函式 等
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Car
    {
    //Field
    //補充小知識:我們通常變數前面加下底面表全域,存取權限通常設定 private
    private _string Title {get;set;}
    private bool Answer {get;set;}

    //Method方法
    //必須回傳string字串
    public string Run()
    {
    return "Success";
    }

    //Constructor 建構子
    //只要創建Car物件時,就必須帶入這些參數
    public Car(string type,string registration)
    {
    _type = type;
    _registration = registration;
    }
    }
  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private bool _Answer { get; set; }
    //下面兩組 Method 組合起來就是上面簡寫
    public string GetAnswer()
    {
    return _Answer;
    }
    public void SetAnswer(bool A)
    {
    _Answer = A;
    }