2016-05-23 251 views
0

我會抽象地說一點,使問題陳述簡潔和簡潔。出於所有目的,我們假設.NET/C#作爲底層技術/語言。一種類型與多種類型

假設您正在編寫一個軟件程序並設計一些類/類型來表示某個感興趣的實體。你會發現這個實體有一些不同狀態的生命週期。當這個實體從一個狀態過渡到另一個狀態時,它們獲得了某些屬性/屬性但是失去了其他的屬性。

現在,如果您要設計一個類/類型來表示這樣的實體,則一種設計選擇將是引入一種包含整個生命週期中實體的所有可能屬性的超集的全包類類型。

另一種選擇是引入某種類型的層次結構,其中您使用不同的類型表示感興趣的實體,其中每個類型代表特定狀態下的實體。

現在我的問題是:

  1. 一般而言,怎麼能決定是否代表一個實體的不同狀態/方面採用性能更好的完成/屬性上單一類型對不同類型的?

  2. 如果您選擇使用多種類型來表示你的實體:

    一個。你將如何處理這個實體的某些特性在多個狀態中存在/定義的情況?

    b。如果你的實體使用JSON被持久化/序列化了呢?考慮到所有代表不同的狀態的不同類型,你將如何序列化並反序列化它?

回答

0

你可能要考慮立足圍繞.NET ExpandoObject(MSDN link)這樣的對象 - 你可以動態地添加/刪除屬性,並詢問是否有一個給定的屬性這給你更多的靈活性比努力。創建一個完整的(靜態)層次結構

0

如果您需要使用多種類型,可以通過複製構建實例或使用工廠創建新類型的實例來將實例從一種類型提升和降級到另一種類型。

但是,我不會單獨依賴類型層次結構,因爲內部狀態是unavoida在狀態機中。

2

您的解決方案都不是特別好。你真正想要的是代數數據類型,又名不相交或有區別的工會。不幸的是,大多數老派的OO語言都沒有這些語言。在.NET生態系統中,主要是F#有適當的支持。見例如herehere作簡要介紹。