Как реализовать абстрактный класс в F #? - PullRequest
10 голосов
/ 22 ноября 2008

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

  1. есть ли у кого-нибудь короткий пример того, как реализовать абстрактный класс, абстрактный метод и виртуальный метод
  2. можно ли перегружать конструкторы?
  3. существуют ли какие-либо ограничения, если я хочу скомпилировать его в dll и сделать его доступным для моих программ на C #.

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


Обновление: Я действительно очень ценю ответ Брайана, но он все еще неясен для меня, поэтому я хочу уточнить. Давайте представим, что это мой абстрактный класс, написанный на C # и скомпилированный в 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 # заинтересован в получении какой-либо документации, которую я нашел в блоге Дона Сайма (создателя F #) бесплатных глав его книги F # Expert . Вы можете скачать их в формате doc.

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

1 Ответ

14 голосов
/ 22 ноября 2008

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

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)
...