2016-06-03 5 views
3

Существует интерфейс (скажем, IA), реализация (скажем Base) интерфейса IA ​​и производный класс Base (например, Derived), который переопределяет абстрактный член IA. Теперь, в реализации переопределенного элемента, я хочу использовать реализацию элемента Base. Однако я не знаю, как писать для этого.Как использовать базовую реализацию переопределенного абстрактного элемента?

Этот код иллюстрирует мой вопрос:

type Flag = 
    | F1 = 1 
    | F2 = 2 

type IA = 
    abstract member A: Flag 

type Base() = 
    interface IA with 
    member this.A = F1 

type Derived() = 
    inherit Base() 

    interface IA with 
    override this.A = (* ? *) 
     // base.A ||| F2    // NG (Compile error that `A` isn't a member of `base`) 
     // (base :> IA).A ||| F2  // NG (Syntax error) 
     // (this :> IA).A ||| F2  // NG (Infinite recursion) 
+0

Не уверен в этом - я думал '((это:> База):> IA). Возможно, сработало, но все равно stackoverflows –

+0

Базовый метод не является общедоступным, вы не можете его вызвать извне. –

ответ

4

Я на самом деле думаю, что нет никакого способа сделать это. Реализации интерфейса F # аналогичны реализациям явного интерфейса в C# и you cannot call base implementation of an explicitly implemented interface in C#.

Чтобы обойти эту проблему, чтобы изменить базовый класс, так что он больше похож на C# реализации неявного интерфейса (который, к сожалению, немного громоздким):

type Base() = 
    // Define virtual property in class Base 
    abstract A : Flag 
    default this.A = Flag.F1 
    // Implement IA via the virtual property 
    interface IA with 
    member this.A = this.A 

type Derived() = 
    inherit Base() 
    // Override the virtual property 
    override this.A = base.A ||| Flag.F2 

Следующая теперь возвращает 3, как и ожидалось:

(Derived() :> IA).A 
+0

Вижу. Это выглядит не так красиво, однако прекрасно работает. Спасибо! – vain0