Наследование типа в F#
-
06-07-2019 - |
Вопрос
Я не могу найти правильный синтаксис для кодирования типа 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)
Но для базового класса без максимального конструктора я не уверен, что это возможно.