物件導向說到這邊其實修飾詞不只有之前所提的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
來看實際例子
這邊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 介面