A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦里不知身是客 中级黑马   /  2014-7-28 11:40  /  1333 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梦里不知身是客 于 2014-7-29 12:25 编辑

二者有什么异同点,如何确定什么时候使用虚方法什么时候使用抽象类。。。。。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 qsq0000hm 于 2014-7-28 13:09 编辑

虚方法是用virtual修饰,抽象方法是用abstract修饰。抽象方法只能定义在抽象类当中,虚方法可以在抽象类也可以实例类。
至于什么时候选择哪种方法来实现多态:
1.如果父类不需要实例化,或者说父类实例化没有意义的时候
2.方法不需要默认实现的时候
可以考虑使用抽象方法。

1.如果父类某种情况下,可能需要实例化对象的
2.这个方法可以默认实现的,或者说需要默认实现的
那么我们可以考虑使用虚方法。当有默认实现的情况下,子类如果不重写父类的虚方法,那么就直接继承了父类的这个方法,并且执行父类的实现。
而抽象方法是必须要在子类中被实现的,并且抽象方法在父类中不能有方法体。

既然说了以上两点,那么再说说接口:
接口也是实现多态的一种手段,一般如果两个类无法抽象出一个父类,并且它们又有相同的方法,并且程序员又希望能够实现多态的,那么可以考虑使用
接口。比如飞机和麻雀,它们显然无法抽象出一个父类,但它们都能飞,只是飞的具体怎么实现不同,那么我们可以把飞的方法封装成一个接口,让飞机盒麻雀实现这个接口,接口的成员在类中是必须要被全部实现的。另一种情况是,某个父类的子类不是一定会有相同的方法,比如animal类好了,它的子类可以有
猫,狗,鸡,麻雀,蝙蝠等等。显然不是每一个animal的子类都会飞,那么把飞这个方法定义在父类中,不管是用虚方法还是抽象方法显然都不合适,因为不是每种动物都会飞,这里也考虑使用接口了。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
1.当类中的方法声明前加上了virtual修饰符,称之为虚方法,反之为非虚;
2.使用了virtual修饰符后,不允许再有static,abstract,或override修饰符;
3.对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变;
4.对于虚方法,它的执行方式可以被派生类改变,这种改变时通过方法的重载来实现的。
5.有时候,基类并不与具体的事物相联系,而是只表达一种抽象的概念,用以为它的派生类提供一个公共的界面。
6.抽象类只能作为其它类的基类,它不能直接被实例化,而且对抽象类不能使用new操作符。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
相同点:都是重载方法,实现不同的功能。
回复 使用道具 举报
相同点:都是重载方法,实现不同的功能。
不同点:虚拟方法有实现部分,抽象方法没有实现部分、
~abstract方法只能在抽象类中声明,虚方法则不是;
~abstract方法必须在派生类中重写,而virtual则不必;
~abstract方法不能声明方法实体,虚方法则可以。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
qsq0000hm 发表于 2014-7-28 12:58
虚方法是用virtual修饰,抽象方法是用abstract修饰。抽象方法只能定义在抽象类当中,虚方法可以在抽象类也 ...

很详细啊,学到了 ,谢谢。。。
回复 使用道具 举报
许庭洲 发表于 2014-7-28 13:42
1.当类中的方法声明前加上了virtual修饰符,称之为虚方法,反之为非虚;
2.使用了virtual修饰符后,不允许 ...

嗯,学习了,谢谢大神。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马