Ich möchte eine Klasse von System.IO.BinaryWriter
ableiten und ihren Konstruktor mit einer benutzerdefinierten Stream
aufrufen, deren Implementierung ein Konstruktorargument des abgeleiteten Typs erfasst. Für das Leben von mir kann ich nicht herausfinden, ob das überhaupt möglich ist. Was ich im Wesentlichen zu tun versuchen, getrimmt zu leicht ein MCV zu sein, istÜbergeben Sie ein Closing-Capturing-Konstruktorargument an den Basisklassenkonstruktor
type HashingBinaryWriter private
(hasher : System.Security.Cryptography.HashAlgorithm,
stream : System.IO.Stream) =
inherit System.IO.BinaryWriter(stream)
let unsupp() = raise(System.NotSupportedException())
let hash_stream =
{ new System.IO.Stream() with
member __.CanRead = false
member __.CanSeek = false
member __.CanWrite = true
member __.Length = unsupp()
member __.Position with get() = unsupp() and set(_) = unsupp()
member __.Seek(_,_) = unsupp()
member __.SetLength _ = unsupp()
member __.Read(_,_,_) = unsupp()
member __.Flush() =()
member __.Write(buffer, offset, count) =
hasher.TransformBlock(buffer, offset, count, null, 0) |> ignore
}
new(hasher) = new HashingBinaryWriter(hasher, hash_stream)
// Or, alternatively
new(hasher) as me = new HashingBinaryWriter(hasher, me.hash_stream)
Die letzte Zeile nicht in jeder Form zu kompilieren, weil hash_stream
nicht definiert ist. Offenbar, wie this answer vorschlägt, unterscheidet sich der Umfang der Konstruktorargumente von dem des Klassendeklarationshauptteils, aber ich muss verstehen, was hier vor sich geht (und wenn möglich das Warum hinter der F # -Entwurfsentscheidung).
In der Tat kann ich einige Problemumgehungen sehen (konvertieren Sie Hash_stream in eine private Eigenschaft, zum Beispiel), aber mein Vokabular von F # idioms fehlt dieser. Meine zweite Frage ist also, was wäre die idiomatische Art, dies zu tun.
vermute ich, der idiomatische Weg zu machen wäre, 'hash_stream' eine Bindung der obersten Ebene, die' hashher' als Argument verwendet –
@JohnPalmer: Macht Sinn, danke. – kkm