2012-01-26 2 views
2

Я хотел бы создать экземпляр анонимного класса в F # и определить собственный хэш/равенство. Может кто-нибудь, пожалуйста, скажите мне, как?анонимный класс в F #

Задание Equals/GetHashCode в интерфейсе не работает. Возможно создать методы, но они не могут быть вызваны каким-либо образом, я вижу. В принципе, я хотел бы создать интерфейс IBlah ниже таким образом, чтобы дать мне объект с указанной хэш-функцией. Самое близкое, что я могу получить, это «экземпляр» функции testfixture, но это производит и экземпляр, который использует хэш по умолчанию.

Я также задавался вопросом, может ли кто-нибудь сказать мне, как можно вызвать «внутренний» GetHashCode в классе impl.

Большое спасибо заранее.

open NUnit.Framework 

type IBlah = 
    abstract anint : int 
    abstract GetHashCode : unit -> int 

type impl (i:int) = 
    interface IBlah with 
     member x.anint = i   
     member x.GetHashCode() = failwithf "invoked" 
    //override x.GetHashCode() = i 

[<TestFixture>] 
type trivial() = 

    let instance i = 
     { 
      new IBlah with 
       member x.anint = i 
       member x.GetHashCode() = failwith "It is invoked after all" 
     } 

    // this fails (in the comparison, not due to a failwith) 
    [<Test>] 
    member x.hash() = 
     Assert.AreEqual (instance 1 |> hash, instance 1 |> hash) 

    // this passes if the commented-out override is added, otherwise it fails due to different hashvalues 
    [<Test>] 
    member x.hash'() = 
     Assert.AreEqual (impl 1 |> hash, impl 1 |> hash) 

    // this passes whether the override is there or not (i.e. no exception is thrown either way) 
    [<Test>] 
    member x.hash''() = 
     impl 1 :> IBlah |> hash |> ignore 

ответ

12

Вам необходимо указать obj (System.Object) в качестве первого типа в вашем выражении объекта для переопределения GetHashCode.

type IBlah = 
    abstract anint : int 

let blah = 
    { new obj() with 
     override x.GetHashCode() = 0 
    interface IBlah with 
     member x.anint = 0 } 
Смежные вопросы