D-22 物件 object ? class ? interface

物件 object 是什麼

昨天一直有提到一個關鍵字物件不過一直沒有說明什麼是物件,因為就等著這一篇一起說明,現在就讓讀者們跟小光一起來了解什麼是物件吧。

object ? class ? interface

「前輩,昨天聽好多物件跟類別然後還有之前說的介面,這些是什麼東西啊。」
今天一早小光就把昨天跟之前聽到的然後還不了解的東西全部都在問一遍,然後大頭依舊埋首於文件之中,大約過了十分鐘大頭才抬起頭來看了小光一眼,並且問了他一句話。
「究竟在要怎麼做開發才會快,你知道嗎?」
顯然這問題考倒了小光,因為聽了這個問題讓小光進入沈思的狀態之中。
「昨天教的方法有讓你感受到開發變容易了嗎?」
「好像比較不用寫那多程式碼了」
聽到大頭更進一步的問題後小光很直覺的把感受到東西說出來,而大頭聽了之後就繼續往下說下去。
「是吧,你還記得ctrl+vloop吧,如果今天會使用方法跟類別會讓你的開發更順利,所以我們更進一步了解物件跟類別吧。」

object

首先來說明什麼是物件吧,在c#的變數都是物件,例如之前的intstring也都是物件,其中物件又分為兩類ValueTypeReferenceType兩類其差異在於處理物件的記憶體的方式不同,其中int這種就是ValueType,所以我們先說明一下這部分。

ValueType

這個ValueType的記憶體是放置於stack內,而且每次異動都會產生一組新記憶體配置,還有例如在方法參數的傳入時也是複製一份資料到新的記憶體配置內,所以方法內的異動不會影響到方法外的變數,所以要將原來的那變數傳入方法內則需要ref關鍵字,詳細內容如下。

using System;

public class Program
{
    private static void Add(int param)
    {
         param++;
    }

    private static void AddRef(ref int param)
    {
        param++;
    }
    public static void Main()
    {
        var param = 10;
        Add(param);
        Console.WriteLine(param);
        AddRef(ref param);
        Console.WriteLine(param);
    }
}

struct

這個ValueType除了基礎型別外還可以自定義型別結構類型,這時候就要用struct這個關鍵字,所以實際的寫法如下。


using System; public class Program { public static void Main() { var param = new Vector(); Console.WriteLine(param); param.X++; Console.WriteLine(param); } public struct Vector { public int X; public int Y; public override string ToString() { return string.Format("X:{0}, Y:{1}", X, Y); } } }

ReferenceType

介紹完ValueType後我們要來介紹ReferenceType,其處理記憶體的方式是將資料放在heap內,而變數內都是記載該資料的記憶體位置,所以傳到方法內如果改變期屬性或欄位則方法外的變數也會被影響到。而且還有一個特性就是其預設值都是null,其中比較特別的是基礎型別中只有stringReferenceType

class

其實說到ReferenceType還有另外一個比較重要的是類別了,至於說到類別就不能不提物件導向設計模式,因為可以透過繼承讓程式開發更便利。

interface

雖然使用類別已及繼承可以帶來開發的便利性,但是不當的繼承已極直接相依於某類別會造成程式於程式的關聯太深,若是類別的異動會直接影響另一個類別的開發,所以這時就要說明介面的重要性,透過has a[介面]可以讓類別直接相依於介面,而介面又只是定義方法的參數不涉及實作的內容,所以搭配起來若是實作有變動其實不影響擁有該介面的類別。
說了那麼多以下來展示一下類別has a介面的設計方式。

public IOperator
{
    int Calc(int x, int y);
}

public class Calculator
{
    private IOperator _operator = null;
    public Calculator(IOperator operator)
    {
        _operator = operator;
    }

    public int Calc(int x, int y)
    {
        return _operator.Calc(x, y);
    }
}

public class PlusOperator : IOperator
{
    public int Calc(int x, int y)
    {
        return x + y;
    }
}

public class MultiOperator : IOperator
{
    public int Calc(int x, int y)
    {
        return x * y;
    }
}

public static void Main()
{
    // 加法計算機
    var calc = new Calculator(new PlusOperator()); 

    // result is 20
    Console.WriteLine(calc.Calc(10, 10));  

    // 乘法計算機
    calc = new new Calculator(new MultiOperator()); 

    // result is 100
    Console.WriteLine(calc.Calc(10, 10));  
}

後記

「前輩,你今天真的說到我頭昏眼花了」
小光揉著他的太陽穴一邊跟大頭這麼說,而大頭聽到後哈哈大笑,並且這麼對他說。
「我只是說個大概而已,關於介面還有很多沒說的,甚至於有些我還需要請到我的前輩跟你介紹IOC呢,不過這是後面的事了,你先吸收一下,並且去了解OOP也就是物件導向設計模式的內容吧。」
所以這一篇物件先到此結束了,敬請期待下一篇的內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *