Тип наследования в F # - PullRequest
       21

Тип наследования в F #

4 голосов
/ 25 октября 2009

Я не могу найти правильный синтаксис для кодирования типа D, который наследует базовый класс B (написанный на C #) и его конструкторы, отличные от неявного конструктора базового класса:

C # код:

public class B
{
    private int _i;
    private float _f;
    public B()
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i)
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i, float f)
    {
        _i = i;
        _f = f;
    }
}

F # код:

type D() =
    inherit B()
    //how to inherit from other constructors ?

Спасибо

Ответы [ 2 ]

6 голосов
/ 26 октября 2009

Я нашел способ сделать это благодаря этому блогу !

type D =
    class
        inherit B

        new () = {
            inherit B()
        }
        new (i : int) = {
            inherit B(i)
        }
        new ((i,f) : int*single) = {
            inherit B(i, f)
        }
    end

Да, это немного громоздко, но, как сказал Брайан, это не большинство случаев.

EDIT: На самом деле, ключевые слова class / end не обязательны для этого (поэтому я возвращаюсь к тому, что я сказал о громоздкости). Как сказал Брайан в своем блоге здесь , F # обычно определяет тип определяемого типа, делая эти токены ненужными / избыточными.

type D =
    inherit B

    new () = {
        inherit B()
    }
    new (i : int) = {
        inherit B(i)
    }
    new ((i,f) : int*single) = {
        inherit B(i, f)
    }
5 голосов
/ 25 октября 2009

Из документов: «Аргументы для конструктора базового класса появляются в списке аргументов в предложении наследования». Например:

type D(i: int) =
   inherit B(i)

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

type D(i : int, f : float) =
  inherit B(i, f)
  new(i : int) = D(i, 0.0)
  new() = D(0, 0.0)

Но для базового класса без максимального конструктора я не уверен, что это возможно.

...