Pergunta

Depois que eu vi esta sessão PDC eu queria tentar aprender um pouco fora#. Então eu pensei que a melhor forma seria a de reescrever em F # algo que eu já tenha feito em C #, mas meu cérebro simplesmente se recusa a pensar em modo funcional. Eu tenho essa classe abstrata que tem alguns métodos abstratos e alguns métodos virtuais. Gostaria de substituir alguns dos métodos virtuais também. Esta classe é escrito em C # e compilados e eu não pretende reescrever i F #. Então, minha pergunta é:

  1. alguém tem uma pequena amostra de como implementar uma classe abstrata, método abstrato e método virtual
  2. Eu posso ter sobrecarregado construtores?
  3. existem quaisquer restrições se eu quiser compilá-lo em uma DLL e disponibilizá-lo para os meus programas baseados C #.

Qualquer ajuda seria apreciada.


Update: Eu realmente apreciado a resposta de Brian, mas ainda não está claro para mim assim que eu quero esclarecer. Vamos fingir esta é a minha classe abstrata escrito em C # e compilados na dll. Como faço para implementá-lo em 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; }
}

Alguns documentação para quem está à procura de alguns recursos F #: - se qualquer outro F # é interessado em obter alguma documentação que encontrei no Don Syme (criador de F #) blogue capítulos gratuitos de seu livro F # Especialista . Você pode baixar os em formato doc.

Alguns outros recursos que possam de interesse:

Foi útil?

Solução

Aqui está um código de exemplo

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top