设计模式简单学习(1)--虚方法(virtual)和抽象方法(abstract)的区别


虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?

1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:

//抽象方法
publicabstractclassAnimal
{
publicabstractvoidSleep();
publicabstractvoidEat();
}

//虚方法
publicclassAnimal
{
publicvirtualvoidSleep(){}
publicvirtualvoidEat(){}
}


2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:

publicclassAnimal
{
publicabstractvoidSleep();
publicabstractvoidEat();
}


编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。如:

publicabstractclassAnimal
{
publicabstractvoidSleep();
publicabstractvoidEat();
}

publicclassCat:Animal
{
publicoverridevoidSleep()
{
Console.WriteLine(
"Catissleeping");
}
//weneedimplementAnimal.Eat()here

}


编译器会报错:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()',因为我们没有实现抽象类中所有抽象方法。

优质内容筛选与推荐>>
1、self.xxx = nil 可以等效于[_xxx release] _xxx= nil 么
2、34个漂亮的应用程序后台管理界面设计(系列三)
3、学车总结
4、原来Windows SDK与DirectX SDK已经集成到VS2012里了
5、在宿舍的同学们,只要你有本本,就可以免费无线上网~~


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn