更新於 2023/04/24閱讀時間約 6 分鐘

【中低階級】-[物件導向]-介面(Interface)、抽象(abstract)與虛擬(virtual)的宣告

  物件導向說到這邊其實修飾詞不只有之前所提的public、private這些,還有可能遇到抽象(abstract)、虛擬(virtual)、覆寫(override)、隱藏(new)、密封(sealed)、介面(interface)等等,我們就來看一下它們的差異吧~

一、抽象(abstract)

  它是一個抽象化的概念,只做定義用途但是不能用來建立物件或是去定義怎麼處理方法的(例如:只知道有「說話」但不知道要怎麼說),若遇到abstract的宣告就必須要覆寫該方法,當你想要使用abstract來宣告方法的話,那麼此class前面就要多加abstract。
程式碼用法:
abstract  class 父類別:
  abstract public string Action();

class  子類別:父類別
  public override string Action()
  {
    敘述;
  }

二、虛擬(virtual)

  它是一個虛擬的方法,所以不能有abstract、static、override的修飾詞,並且也不能為私人的,因此也就不能使用private這個修飾詞。
  由於是一個虛擬的方法因此是可以去定義怎麼處理的方法(例如:知道有「說話」並且會說「做得非常好!」),並且它也可被修改基底的方法。也就是遇到virtual的宣告就代表可以被覆寫該方法,(例如:將「做得非常好!」修改成「辛苦了!這邊你覺得還可以怎麼做會更好呢?」,那麼最後就會呈現依後者所做的修改結果為主),簡言之就是可以被覆蓋原來的做法內容
程式碼:
class 父類別:
  public virtual void food()
  {
    敘述;
  }

class 子類別:父類別
{
  public override void food()
  {
    敘述;
  }
}

三、覆寫(override)

  就是去更改父類別原有的方法或內容,也就是說遇到抽象(abstract)的宣告那麼子類別就一定會出現覆寫(override)的方法,或是看到虛擬(virtual)想要更改執行內容,也就會在子類別中出現覆寫(override)。
  想要做override,父類別就必須要有virtual或abstract相關的宣告才可以使用它,並且名稱要跟父類別的方法名稱一樣才行!
程式碼:(例子可以看上面抽象、虛擬的例子,用在於子類別中)

四、隱藏(new)

  大家看到new看起來應該不陌生,通常在建立物件、呼叫建構函式會用到它。但是!!這邊我要說的是「隱藏」用途,可能就會比較陌生一點點吧!(我自己對它是很陌生的,所以去了解了一下)
  對於父類別成員隱藏繼承的成員,看不懂!若遇到子類別想要修改父類別的內容值的話,就要使用override,但是發現父類別沒有使用抽象(abstract)、虛擬(virtual)這樣的方法,那怎麼辦?此時就可以使用new這個修飾詞了!
  如果只是少數或其一要修改內容的話,那麼為何不直接在父類別加入virtual這個修飾詞呢?是因為為了增加擴充的彈性,程式未來的變化修改狀況可能會很多,同一支程式會一直優化優化再優化,所以也就有了這個修飾詞方便我們做擴充。
Note:我有看到網路上有人解釋得更仔細 1.C# - new和override的差異與目的

五、密封(sealed)

  這是一個防止被繼承(也就是不能當爸爸)或防止被覆寫,看是用在類別還是屬性、方法,也就是相對應的不可被繼承與覆寫,但是呢!想要密封(sealed)就必須跟著覆寫(override)才能使用
程式碼1:
sealed  class  A
{
  敘述;
}

class  B:A
{
  //不能將A當作爸爸,因為A前面有sealed
}
程式碼2:
class  A
{
  virtual private void talk()
  {
    敘述;
  }
}

class  B:A
{
  sealed private override void talk()
  {
    敘述;
  }
}

class  C:B
{
  private override void talk()
  {
    //不能使用talk這個方法了,因為C是繼承B,然而Class B的talk方法前面已經有了(密封)sealed,因此在Class C中不可更改內容。
  }
}

六、介面(interface)

1.什麼是「介面(interface)」?
  interface只敘述有哪些欄位屬性和行為方法,並不會去做怎麼執行的ㄛ!
  舉例來說:人會說話、玩遊戲,那麼「人」就是介面的命名,「說話」、「玩遊戲」就是介面裡的內容,至於說什麼話,玩什麼遊戲,在介面中是不會去做的事,而是類別中有去繼承此介面才會去做的事。
  那麼類別若繼承了「人」這個介面,那麼此介面中的「說話」、「玩遊戲」都需要去實作,也就是都要讓它們實際的做事情才可以。
*通常使用interface時,它的命名方式都以「I」開頭為主 *類別可以繼承多個介面,介面與介面中用「,」隔開 *類別使用介面時,介面當中的內容都必須要實際做事情才可以,不可有落單情形發生 *類別使用介面中的內容時,必須為Public
來看實際例子
介面1
介面1
介面2
類別
主程式
執行結果
這邊ClassStudent類別繼承了兩個介面分別為IPeople、IIdentity,那麼ClassStudent類別的內容就必須包含IPeople、IIdentity介面裡的所有內容並且實作它才可以。
由於介面的內容都屬於Public,因此主程式可以直接使用類別中所繼承介面的相關內容。

  到目前為止是對於抽象(abstract)、虛擬(virtual)、覆寫(override)、隱藏(new)、密封(sealed)、介面(interface)的用法以及前面五個他們之間的關係介紹。
這邊對於我來說是必須要動手操作好幾次才可以了解它們的用法,所以如果用看的不了解,不妨也動手操作試試看吧!有做才能有收穫哦!
參考資料: 1.[C#] 物件導向三大特性 2.C#雜記 — 介面(interface)、抽象( abstract)、虛擬(virtual)之我見 3.[C#] 區分 abstract、virtual、override 和 new 4.Day25 | 善用 interface 抽象概念,為 Class 找到出路 5.sealed (C# 參考) 6.DAY 13 介面

分享至
成為作者繼續創作的動力吧!
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

作者的相關文章

橙果杏的沙龍 的其他內容

你可能也想看

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.