Сравнение иерархии классов F # - PullRequest
0 голосов
/ 16 июля 2011

Как лучше всего решить эту проблему?Вот простая иерархия классов в F #:

[<AbstractClass>]
type BaseClass (name: string) = 
  member this.Name with get() = name

type FooClass (n, i: int) =
  inherit BaseClass (n)
  member this.Num with get() = i

type BarClass (n) = inherit BaseClass (n)

Мне нужно будет добавить к этой иерархии довольно много по мере продвижения проекта.Мне нужно приравнять экземпляры этих классов, проверяя, имеют ли они одинаковый тип и имеют одинаковое значение для Name (а также то же значение для Num, если оно FooClass), поэтому ReferenceEquals не будет его обрезать,Каков наилучший способ сделать это?Должен ли я заставить BaseClass наследовать IComparable, и если да, то как мне тогда обращаться с типами, которые наследуются от BaseClass, и иметь дополнительные поля для проверки?Другой способ сделать это - создать класс IComparer, который будет проверять каждый отдельный класс, но я действительно хочу, чтобы код был в соответствующем классе, а не в компараторе

1 Ответ

3 голосов
/ 16 июля 2011

Я считаю, что переопределение равно для базового класса, а затем переопределение равно для каждого подкласса путем использования реализации базового класса - это стандартный подход в .NET OO:

[<AbstractClass>]
type BaseClass (name: string) = 
  member this.Name with get() = name
  override this.Equals(other:obj) =
    match other with
    | :? BaseClass as other ->
        other.Name = this.Name
    | _ -> false


type FooClass (n, i: int) =
  inherit BaseClass (n)
  member this.Num with get() = i
  override this.Equals(other:obj) =
    match other with
    | :? FooClass as other when base.Equals(other) -> //check type equality with this, and base equality
        other.Num = this.Num //check the additional properties for this supertype
    | _ -> false

type BarClass (n, i: bool) =
  inherit BaseClass (n)
  member this.Truth with get() = i
    override this.Equals(other:obj) =
    match other with
    | :? BarClass as other when base.Equals(other) ->
        other.Truth = this.Truth
    | _ -> false

let f1 = FooClass("Foo", 1)
let f2 = FooClass("Foo", 1)
f1 = f2 //true
let f3 = FooClass("Foo", 2)
f1 = f3 //false

//polymorphism in action (bc1 BaseClass will use sub class override)
let checkBaseClassesForEquality (bc1:BaseClass) (bc2:BaseClass) =
    bc1 = bc2

checkBaseClassesForEquality f1 f2 //true
checkBaseClassesForEquality f1 f3 //false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...