如何在F#中实现抽象类?
看过PDC课程后,我想试着学习一些F。所以我认为最好的方法是用F重写,这是我在C语言中已经做过的,但我的大脑就是拒绝以功能模式思考。 我有一个抽象类,它有一些抽象方法和一些虚拟方法。我也想重写一些虚拟方法。这个类是用C语言编写和编译的,我不打算重写它。 所以我的问题是:如何在F#中实现抽象类?,f#,abstract-class,F#,Abstract Class,看过PDC课程后,我想试着学习一些F。所以我认为最好的方法是用F重写,这是我在C语言中已经做过的,但我的大脑就是拒绝以功能模式思考。 我有一个抽象类,它有一些抽象方法和一些虚拟方法。我也想重写一些虚拟方法。这个类是用C语言编写和编译的,我不打算重写它。 所以我的问题是: 有人有一个如何实现抽象类、抽象方法和虚拟方法的简短示例吗 我可以有重载构造函数吗 如果我想在dll中编译它并使其可用于基于C#的程序,是否有任何限制 任何帮助都将不胜感激 更新: 我真的很感激布赖恩的回答,但我仍然不清楚,所以
更新: 我真的很感激布赖恩的回答,但我仍然不清楚,所以我想澄清一下。让我们假设这是我用C#编写并用dll编译的抽象类。如何在F#中实现它
公共抽象类MyAbstractClass
{
公共抽象人物GetFullName(字符串firstName,字符串lastName);
公共抽象bool-TryParse(字符串全名,out-Person);
公共虚拟IEnumerable GetChildren(个人家长)
{
List kids=新列表();
foreach(人群中的儿童人)
{
如果(person.Parent==Parent)
添加(儿童作为人);
}
归还孩子;
}
公共虚拟IEnumerable组的人{get;set;}
}
为寻找F#资源的人提供的一些文档: -如果其他F#有兴趣获得我在Don Syme(F#的创建者)博客上找到的一些文档。你可以下载doc格式的
- Tomas Petricek的真实世界函数编程
- 职位
- F#的地方
- 以下是一些示例代码
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)
类型IBaz=
抽象成员Baz:int->int
[]
类型MyAbsClass()=
//摘要
抽象成员Foo:int->int
//虚拟(具有默认值的摘要)
抽象成员栏:字符串->整型
默认值为.Bar s=s.长度
//混凝土
这个成员。Qux=x+1
//一种实现接口的方法
抽象成员Baz:int->int
与IBaz接口
成员this.Baz x=this.Baz x
键入MySubClass(z:int)=
继承MyAbsClass()
覆盖这个。Foo x=x+2
重写此.Bar s=(base.Bar s)-1
覆盖这个。Baz x=x+100
请记住这个。Z=Z
new()=MySubClass(0)
设c=newmysubclass(42)
printfn“%d%d%d%d%d”c.Z(c.Foo 40)(c.Bar“two”)(c.Qux 41)(c.Baz 42000)
一个F#抽象类也可以实现一个接口吗?实际上,我的意思是有可能让接口的抽象成员也实现一个接口。例如,将IBaz与抽象成员Baz:int->intNo进行接口,这种语法是不允许的,因为它与C#中的“抽象类C:System.IComparable{abstract int System.IComparable.CompareTo(object x);}”完全等效,这也是不允许的。
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)