Вопрос

Я не могу найти правильный синтаксис для кодирования типа 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 ?

Спасибо

Это было полезно?

Решение

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

type D =
    class
        inherit B

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

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

Редактировать:На самом деле, ключевые слова 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)
    }

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top