Como implementar uma classe abstrata em F #?
-
10-07-2019 - |
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 é:
- alguém tem uma pequena amostra de como implementar uma classe abstrata, método abstrato e método virtual
- Eu posso ter sobrecarregado construtores?
- 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.
- Real World Programação Funcional por Tomas Petricek tem livre capítulo aqui
Alguns outros recursos que possam de interesse:
- post de Scott Hanselman O blog de
- Dustin Campbell O blog de
- Tomas Petricek
- O lugar para F # - hubFS
- F # WIKI
- Microsoft Research
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)