Как реализовать абстрактный класс в F #?

После того, как я увидел этот сеанс PDC, я хотел попробовать узнать немного F #. Поэтому я думал, что лучший способ - переписать в F # то, что я уже сделал на С#, но мой мозг просто отказывается думать в функциональном режиме. У меня есть этот абстрактный класс, который имеет некоторые абстрактные методы и некоторые виртуальные методы. Я также хотел бы переопределить некоторые из виртуальных методов. Этот класс написан на С# и скомпилирован, и я не собираюсь переписывать его я F #. Поэтому мой вопрос:

  • У кого-нибудь есть короткий пример того, как реализовать абстрактный класс, абстрактный метод и виртуальный метод.
  • Можно ли перегружать конструкторы?
  • Есть ли какие-либо ограничения, если я хочу скомпилировать его в dll и сделать его доступным для моих программ на С#.

Любая помощь будет оценена по достоинству.


Обновление: Я действительно очень оценил ответ Брайана, но мне все еще не ясно, поэтому я хочу уточнить. Предположим, что это мой абстрактный класс, написанный на С# и скомпилированный в dll. Как реализовать его в F #?

public abstract class MyAbstractClass
{
    public abstract Person GetFullName(string firstName, string lastName);

    public abstract bool TryParse(string fullName, out Person person);

    public virtual IEnumerable<Person> GetChildren(Person parent)
    {
        List<Person> kids = new List<Person>();
        foreach(Child person in GroupOfPeople)
        {
            if(person.Parent == parent)
               kids.Add(child as Person);
        }
        return kids;
    }

    public virtual IEnumerable<Child> GroupOfPeople { get; set; }
}

Некоторая документация для тех, кто ищет некоторые ресурсы F #: - если любой другой F # заинтересован получить какую-то документацию, которую я нашел в блоге Don Syme (создатель F #) свободных главах своей книги F # Expert. Вы можете загрузить их в формате doc.

Некоторые другие ресурсы, которые могут вас заинтересовать:

Ответ 1

Вот пример кода

type IBaz =
    abstract member Baz : int -> int

[<AbstractClass>]
type MyAbsClass() =
    // abstract
    abstract member Foo : int -> int
    // virtual (abstract with default value)
    abstract member Bar : string -> int
    default this.Bar s = s.Length 
    // concrete
    member this.Qux x = x + 1

    // a way to implement an interface
    abstract member Baz: int -> int
    interface IBaz with
        member this.Baz x = this.Baz x

type MySubClass(z : int) =
    inherit MyAbsClass()
    override this.Foo x = x + 2
    override this.Bar s = (base.Bar s) - 1
    override this.Baz x = x + 100
    member this.Z = z
    new () = MySubClass(0)

let c = new MySubClass(42)    
printfn "%d %d %d %d %d" c.Z (c.Foo 40) (c.Bar "two") (c.Qux 41) (c.Baz 42000)