物件導向設計基本概念

物件導向設計基本概念、三大特性(封裝、繼承、多型)、Class(類別)、封裝Encapsulation、繼承Inheritance、多型Polymorphism

基本概念

類別Class

類別Class就像是設計藍圖、範本,定義物件的內部結構以及特點,而在程式世界則是由屬性(attribute)以及方法(method)構成。

程式語言C#,用人來當範例:

如下抽象人的類別,屬性有姓名、性別、年齡,方法有吃的動作。

class person
{
    public string Name = "";
    public string age = "";
    public string sex = "";

    public string eat()
    {
        return "eat apple";
    }
    
    public string sayDetial ()
    {
        return "name : " + Name + "、age : " + age + "、sex : " + sex;
    }
}

物件Object

物件Object就像實體的東西,例如人、鳥、狗、貓等等,在程式世界就是New的概念,將類別實體化。

搭配上述類別範例來實體化一個人,宣告p這個實體,名字是Alex、性別是M、年齡是25,行為能夠吃蘋果以及說出基本資料。

static void Main(string[] args)
{
    person p = new person();
    p.Name = "Alex";
    p.sex = "M";
    p.age = "25";
    Console.WriteLine(p.eat());
    Console.WriteLine(p.sayDetial());
    Console.Read();
}

結果:

三大特性

一.封裝Encapsulation

顧名思義將資料封裝起來,定義那些屬性以及方法是否對外提供存取,而使用者只能知道類別哪些是對外公開,而無法得知內部構造,我們用上述類別為例,只知道可以透過sayDetial()取得基本資料,而我們並不會知道它內部是如何取得資料。

封裝修飾詞:

1.public(無任何限制)

2.protected(僅允許在自已類別和子類別中存取)

3.private(僅允許在自己類別存取)

 

二.繼承Inheritance

子類別(subclass)也可稱之為衍生類別(derived class)。

父類別(super class)也可稱之為基礎類別(base class)。

當子類別繼承了父類別代表,子類可以擁有父類所提供的屬性(attribute)以及方法(method),將共通點傳承下來衍生出自己新的特點,最大的目的就是code reuse,減少程式中重複的部分。

範例我們一樣沿用上述person類別實現繼承的例子。

//artist(子類)繼承了person(父類),衍生了自己新的屬性以及方法卻不需要再重新撰寫Name、sex,因為繼承了父類
class artist : person
{
    public string stageName = "";
    public String skill()
    {
        return stageName + " 正在用水彩畫畫";
    }
}


private static void Main(string[] args)
{
    artist art = new artist();
    art.Name = "美美";
    art.sex = "F";
    art.age = "20";
    art.stageName = "築夢踏實";
    Console.WriteLine(art.skill());
    Console.WriteLine(art.eat());
    Console.WriteLine(art.sayDetial());
    Console.Read();
}

結果:

 

三.多型Polymorphism

多型又包含了多載(Overloading)以及複寫(Overloading)。

多載(Overloading)

多個相同名稱的Method,因傳入不同的參數,依序各別執行。

string showparms(string p1)
{
    return p1;
}
string showparms(string p1, string p2)
{
    return p1 + p2;
}

 

覆寫(Overloading)

當父類提供的Method實作結果並非子類別想要的,此時可以透過覆寫的方式來重新實作。

//假設鳥的叫聲預設是嘰嘰喳喳,但是當貓頭鷹繼承了鳥類別,而發出的聲音則是嗚嗚,此時可利用覆寫的方式實作
class bird
{
    protected virtual string  makeSound()
    {
        return "嘰嘰喳喳";
    }
}

class owl : bird
{
    protected override string makeSound()
    {
        return "嗚嗚";
    }
}

物件導向設計五大原則SOLID可參考:https://dotblogs.com.tw/jc_blog/2019/11/21/solid

 

參考網址:

https://medium.com/@totoroLiu/%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91-object-oriented-programming-%E6%A6%82%E5%BF%B5-5f205d437fd6