物件導向課程心得Part1

物件導向課程心得Part1
Hi guys,好一段時間沒有寫部落格了
因為當兵的關係比較沒時間,原本打算退伍之後再開始寫
但離退伍剩不到1個月的時間,所以打算六日去上課
於是報名了Skilltree物件導向課程
昨天上完第一天的課程,想說稍微整理一下課程聽到的東西
順便練習寫部落格,看看自己了解多少
所以花了一點時間整理了一些東西
希望大家看了多少也有一點了解

抽象

抽象可以說是物件導向一個非常重要的概念
什麼是抽象?
今天講一個例子好了
你有5顆棒球,5顆足球,5顆籃球
今天要你分球,沒告訴你怎麼分
但是分類這個動作就是抽象的技巧
你可能會用球的種類去區分,也可能用球的顏色區分
分類是必須的,但方式並非絕對的(依據情境需求)

其實在生活中,我們都已經有抽象的能力
但是當你在寫程式的時候,我們往往就失去了這個能力
你看到Toyota Altis 你會認為是房車
你看到BMW M5 你會認為是休旅車
你看到藍寶堅尼 你會認為是超跑
Why?為什麼會有這樣的答案?
因為你已經抽象,你已經替他們做了分類了
所以你可能是依照價錢,外觀,性能去分類不是嗎 

MSDN 抽象類別介紹


抽象類別無法具體化
抽象方法隱含為虛擬方法
只有在抽象類別中才允許抽象方法宣告
抽象類別可能包含抽象方法和存取子
無法使用 sealed 修飾詞來修改抽象類別
在抽象方法宣告中使用 static 或 virtual 修飾詞是錯誤的

解釋


無法實體化就是不能被New
abstract class BaseClass   // 抽象類別
{
  public abstract void AbstractMethod();   // Abstract method
}

  BaseClass bc = new BaseClass();   // Error
  //因為abstract抽象類別就是要拿來給人家繼承的,所以設計理念是不能夠被實體化
  
抽象方法隱含為虛擬方法 ,抽象方法不需要實際寫Code,只需要創立Method,凡是有 {  } 的方法,在C#都被認定為完整實作
abstract class BaseClass   // 抽象類別
{
  public abstract void AbstractMethod();   //抽象方法
}

class Test  // 一搬類別
{
  public abstract void AbstractMethod(); //這樣是錯誤的,因為抽象的方法必須在抽象類別內,不能在一搬類別內 
}
抽象類別可能包含抽象方法和存取子,可以有Method沒實作,也可以有屬性get,凡具有 abstract 的修飾詞都必須要子類別 override
abstract class BaseClass   // 抽象類別
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   // 抽象方法
    public abstract int X    { get; }        // 抽象存取子
    public abstract int Y    { get; }        // 抽象存取子
}
無法使用 sealed 修飾詞來修改抽象類別
sealed  abstract class BaseClass   // 這樣是錯誤的,抽象類別的設計就是要給子類別繼承,這邊編譯器不會讓你通過
{
  public abstract void AbstractMethod();   //抽象方法
}

sealed class Test  // 一搬類別 可以是用sealed ,但使用後就不能被繼承
{
  public void MyVoid(int x)
  {
      //Code
  }
}
在抽象方法宣告中使用 static 或 virtual 修飾詞是錯誤的
相信大家都知道,如果在方法上加上virtual 修飾詞
一但該類別被繼承,有加上virtual 修飾詞的方法就可以被Override
但抽象類別本來就要被繼承,abstract 的屬性跟方法都要被子類別Override
所以這編譯器也不允許
以上大致上是我整理出來抽象類別的一些特性

接下來我們一起來看抽象類別的範例
 

abstract class BaseClass   抽象類別
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   //抽象方法
    public abstract int X    { get; }        //抽象存取子
    public abstract int Y    { get; }        //抽象存取子
}

class DerivedClass : BaseClass
 //DerivedClass 繼承BaseClass 就必須實作所有abstract 的方法跟屬性
{
    // 覆寫抽象方法
    public override void AbstractMethod() 
    {
        _x++;
        _y++;
    }
    // 覆寫屬性
    public override int X   
    {
        get
        {
            return _x + 10;
        }
    }
    // 覆寫屬性
    public override int Y   
    {
        get
        {
            return _y + 10;
        }
    }

    static void Main()
    {
        DerivedClass o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
    }
}
// Output: x = 111, y = 161

後續還會有課程心得,只要整理出來就會發佈,請大家盡情期待
若以上有誤歡迎各位糾正我,謝謝

物件導向課程心得Part2