我有,一般會從數據構建的Stream
對象的小的分層次,但對於一些特定的子類,可以從一個簡單的參數列表來合成。在從子類鏈接構造函數時,我遇到了確保處理基類構造函數所需的合成流的問題。它不逃避我這種方式使用IDisposable
對象可能只是骯髒的池(PLZ建議?)由於我沒有考慮的原因,但除了這個問題,它似乎相當簡單(和良好的封裝)。傳遞IDisposable的對象,通過構造函數鏈
代碼:
abstract class Node {
protected Node (Stream raw)
{
// calculate/generate some base class properties
}
}
class FilesystemNode : Node {
public FilesystemNode (FileStream fs)
: base (fs)
{
// all good here; disposing of fs not our responsibility
}
}
class CompositeNode : Node {
public CompositeNode (IEnumerable some_stuff)
: base (GenerateRaw (some_stuff))
{
// rogue stream from GenerateRaw now loose in the wild!
}
static Stream GenerateRaw (IEnumerable some_stuff)
{
var content = new MemoryStream();
// molest elements of some_stuff into proper format, write to stream
content.Seek (0, SeekOrigin.Begin);
return content;
}
}
我認識到,沒有設置一MemoryStream
的是不完全的壞CLR公民的世界停止的情況下,但它仍然讓我神經過敏(更不用提,我可能並不總是使用其他子類型的MemoryStream
)。這不是在範圍上,所以我不能明確地Dispose()
後來在構造函數中,並加入在GenerateRaw()
一個using
語句是弄巧成拙,因爲我需要的流返回。
有沒有更好的方法來做到這一點?
先發制人:
- 是,在
Node
構造計算的性質應該是基類的一部分,不應該由(或接近)來計算的子類 - 我不會要求流被傳遞到CompositeNode(其格式應該無關的呼叫者)
- 先前迭代不得不在基類中的值計算作爲一個單獨的受保護的方法,該方法我那麼就稱爲在每個亞型的構造的端,將
GenerateRaw()
的主體轉化爲一個使用CompositeNode
構造函數體中的語句。但要求呼籲每個構造,不能夠的重複,以保證它的每一個亞型永遠運行(一Node
不是Node
,語義,如果沒有這些屬性進行初始化)給了我神經過敏遠遠高於糟糕(潛力)資源泄漏在這裏呢。
我知道這是一個老問題,但如果你還記得。 。爲什麼你沒有在構造函數參數中使用字節數組而不是流? – Oscar 2017-10-18 22:11:04