sirve - ¿Cómo implementar una clase abstracta en F#?
implementación de clases abstractas (1)
Aquí hay un código de muestra
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)
Después de ver esta sesión de PDC, quería intentar aprender un poco de F #. Así que pensé que la mejor manera sería reescribir en F # algo que ya hice en C #, pero mi cerebro simplemente se niega a pensar en modo funcional. Tengo esta clase abstracta que tiene algunos métodos abstractos y algunos métodos virtuales. Me gustaría sobrescribir algunos de los métodos virtuales también. Esta clase está escrita en C # y compilada, y no tengo la intención de volver a escribirla i F #. Entonces mi pregunta es:
- ¿Alguien tiene una breve muestra de cómo implementar una clase abstracta, un método abstracto y un método virtual?
- ¿Puedo haber sobrecargado constructores?
- ¿Hay alguna restricción si quiero compilarla en un dll y ponerla a disposición de mis programas basados en C #?
Cualquier ayuda sería apreciada.
Actualización: realmente aprecié mucho la respuesta de Brian, pero todavía no está claro, así que quiero aclararlo. Hagamos de cuenta que esta es mi clase abstracta escrita en C # y compilada en dll. ¿Cómo lo implemento en 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; }
}
Alguna documentación para quien esté buscando algunos recursos de F #: - si algún otro F # está interesado en obtener cierta documentación que encontré en el blog de Don Syme (creador de F #) capítulos gratuitos de su libro F # Expert . Puede descargarlos en formato doc.
- La programación funcional del mundo real por Tomás Petricek tiene capítulo libre aquí
Algunos otros recursos que pueden ser de su interés: