F#入门-第四章 面向对象-第六节 重载

抽象方法
    抽象方法是指没有任何实现,没有函数体的方法。

    在实际使用的时候,利用默认定义的实现或继承父类提供的实现。

    要利用抽象方法,需要使用abstract关键字。同时,因为没有实现,所以声明成员时所要用到的类本身的引用名是不必要的,取而代之的是,需要书写方法的类型名。

    同时,为了提供默认实现,需要使用default关键字。

具有抽象方法的类
type Animal = class
    new () = {}
    abstract Bark : unit -> unit
    default x.Bark ()= System.Console.WriteLine("wan wan")
    end;;
let a = new Animal() in a.Bark();;


    动物会叫,所以这个Animal类将动物会叫这个特性抽象化,变成了Bark抽象方法。然后,利用default关键字,提供了默认实现。

重载
  
我们已介绍过子类可以继承父类,然后在父类的基础上改写一部分父类的功能。声明成抽象方法的成员也可以被继承了之后在子类中进行修改,这就叫方法的重载(用member声明的成员不能被重载。)重载是面向对象中用来实现多态性的功能之一。

    使用override来实现函数重载。首先继承Animal类,然后创建Dog类与cat类。

方法的重载
type Dog = class inherit Animal
    new () = {}
    end;;
type Cat = class inherit Animal
    new () = {}
    override x.Bark () = System.Console.WriteLine("nya- nya-");
    end;;
let a = new Dog() in a.Bark();;
let b = new Cat() in b.Bark();;


    因为Cat类的鸣叫声与众不同,所以重载了Bark方法。Dog类与Animal类的行为大致相同,基本上没有什么处理。

抽象类
    虽然这里创建的Animal类默认鸣叫声为“汪汪”,但是动物默认的鸣叫声为“汪汪”的话,这种设计是不好的。因此,如果能定义不提供默认实现,只提供抽象方法的类可能是最好的。

    下例中声明用AbstractClass将类指定成抽象类,从而实现这一想法(只提供抽象方法,不提供默认实现的类)。

抽象类
[<AbstractClass>]
type Animal = class
    new () = {}
    abstract Bark : unit -> unit
    end;;
type Dog = class inherit Animal
    new () = {}
    override x.Bark () = System.Console.WriteLine("wan wan");
    end;;
type Cat = class inherit Animal
    new () = {}
    override x.Bark () = System.Console.WriteLine("nya- nya-");
    end;;
let a = new Dog() in a.Bark();;
let b = new Cat() in b.Bark();;


    现在因为Animal只是抽象类,所以不能被实例化了。

 

    象上例中那样只具有抽象方法的抽象类的情况,用接下来介绍的接口会更加适合。使用抽象类的目的大部分是为了让类能提供某种程度的实现,而只想将一部分方法转变成抽象方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值