iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 7
0
自我挑戰組

Framework 設計原則系列 第 7

Types 設計原則(2) - Class, Struct, Interface 之間如何選擇

  • 分享至 

  • xImage
  •  

本文重點

  1. Class 與 Struct,選誰?
  2. Abstract Class 與 Interface,選誰?

Class vs Struct

酒井~這難解的三角習題中,誰才是真命天子??!!/images/emoticon/emoticon51.gif

分手擂台第一對要上場的是 - Class 與 Struct

這一切酒井是Class的命運捉弄,抑或是Struct的因果循環的報應呢?

讓我們繼續看下去~

Class無庸置疑是最常使用的type

可以作為資料傳遞的物件

也可以在裡面寫一些方法,有的沒的

事實上,Struct也可以做到上面這些事

但是Struct無法宣告空的建構子,已不能繼承

Struct說真的還蠻少見,自從大學畢業後就沒見過他了,事實上我還沒有寫過Struct

我看完這一小章節的結論就是:用Class,不要用Struct

其實書上是沒有講得那麼明顯,書中列舉了下列四點使用Struct的時機

當下列4個條件完全吻合時,才會建議你用Struct

  1. 都用一些古老語言就有的int, double這些single value
  2. size 小於16 bytes (????)
  3. 不可變動的
  4. 不會經常被轉成類別的。像下面範例的i就被轉換了
int i = 123;
// The following line boxes i.
object o = i;  

我也不知道我在寫啥,原文如下

defining a struct unless the type has all of the following characteristics:

  1. It logically represents a single value, similar to primitive types (int, double, > > etc.).
  2. It has an instance size under 16 bytes.
  3. It is immutable.
  4. It will not have to be boxed frequently.
    In all other cases, you should define your types as classes.

結論先講完了,接下來探討一下Class與Struct到底有啥不一樣的地方

Class與Struct最大的差異就是

Class是Reference type

Struct是value type

所以本章節大部分的文章都在描述Reference type 與value type有什麼不同
看到這邊時我一直很糾結到底要先講Reference type 與value type
還是先講Class 跟 Struct如何選擇?
Reference type 與value type希望明天能讀完

除此之外,Class與Struct除了這個之外還有啥不一樣的地方,請看下表

Class Struct
Reference type value type
可繼承 不可繼承
可變更 不可變更
不能有預設建構子

Abstract Class vs Interface

這裡的Class指的是abstract class

也對,Class與Interface本來就是兩個截然不同的東西

選擇上有甚麼好困擾的?

但是abstract class與Interface都可以宣告方法給子/實作類別實作

選擇上,究竟是要繼承abstract class好

還是實作Interface呢?

先就我所知道的,列表一下Abstract Class 與 Interface的差異吧

Abstract Class Interface
可以寫方法內容 只能宣告方法
可以有各種方法 只宣告public方法
單一繼承 多重繼承

除了繼承輸給Interface之外,class還是贏面大

可以寫預設的方法,又可以讓子類別overwrite

判斷實作類別與父類別/Interface之間的關系決定

  1. is a : 用繼承。ex:狗是一種動物
public abstract class Animal{
    ...
}
public class Dog : Animal{
    ...
}
  1. has a : 用介面。是一種...
  2. can do : 用介面。可以....

如果無法判斷,書中建議使用class

favor defining classes over interfaces.

用設計良好的class取代interface可以讓組件從實做中脫鉤?

use abstract classes instead of interfaces to decouple the contract from implementations.
Abstract classes, if designed correctly, allow for the same degree of decoupling between contract and implementation.

那甚麼時候用interface呢?

當你要提供一個多功能value type時

public struct Int32 : Icomparable, IFormattable, IConvertible{
...
}

話雖這麼說,但M$的.NET Framework還是很多interface....


拉低賽

魯妹又強迫提供一個新故事了

那天來了一個不知道身體哪裡有問題的美國人

美國人:窩會縮一點中文
同事(鬆一口氣):好,請問你哪裡不舒服
美國人:窩聽噗懂@@


上一篇
Types 設計原則(1) - 開始規劃Namespace
下一篇
Types 設計原則(3) - Abstract Class , Static Class
系列文
Framework 設計原則30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言