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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© laoyang 黑马帝   /  2011-11-21 22:38  /  3427 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 laoyang 于 2011-11-23 14:24 编辑

虚方法和抽象方法有什么具体的区别?要怎么用啊?

5 个回复

倒序浏览
本帖最后由 何建华 于 2011-11-22 00:02 编辑

虚方法:使用virtual关键字修饰,但使用virtual关键字修饰的方法在本类中必须有实现,就算是空的也要实现,例如:
class Program
{      
       static void Main(string[] args)
        {
            Person p = new Person;      
            p.ShowGender();   

            Console.ReadKey();
        }
}
    class Person
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public virtual void ShowGender()
        {
           
        }
    }

抽象类:abstract关键字修饰,不能实例化,可以有抽象成员也可以有非抽象成员
1.有抽象成员的类必须标记为abstract,并且不能有任何实现
2.类中的抽象成员在子类中必须实现override,若子类是抽象类则不需要override

virtual方法和abstract方法的区别:
virtual方法子类可以override,也可以不override。而abstract在子类中必须override

简单的说用法
virtual用法:当父类要被实例化的时候用virtual
abstract用法:当父类不会被实例化的时候用abstract


评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 刘景发 于 2011-11-22 00:32 编辑

楼上回答的很好,简单明了,并带有例子。我在这把详细的区别贴出来,不过是我以前转别人博客收藏下来的,请楼主参考下!:)
用法可以简单描述成这样:
//抽象方法
public abstract class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

//虚方法
public class Animal
{
    public virtual void Sleep(){}
    public virtual void Eat(){}
}
一、Virtual(虚拟):
1.修饰方法、属性、索引器或事件声明
2.允许在派生类中重写这些对象。说明:派生类可以重写这些方法,也可以不重写这些方法
3.修饰方法时注意:(可以有方法体)
  调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
     默认情况下,方法是非虚拟的。不能重写非虚方法。  
     virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。
4.虚拟属性的行为与抽象方法一样。
   在静态属性上使用 virtual 修饰符是错误的。
    通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。

二、Abstract(抽象):
1.修饰类、方法、属性、索引器及事件
2.在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。
3.标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。说明:派生类必须实现
4.抽象类具有以下特性:
  抽象类不能实例化。
   抽象类可以包含抽象方法和抽象访问器。
  不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
  从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
5.抽象方法具有以下特性:(没有方法体)
·      抽象方法是隐式的虚方法。
·      只允许在抽象类中使用抽象方法声明。
·      因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签后 没有大括号 ({ })。例如: public abstract void MyMethod();
    实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。

·      在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
6.抽象属性的行为与抽象方法一样。
·     在静态属性上使用 abstract 修饰符是错误的。
在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

评分

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

查看全部评分

回复 使用道具 举报
    抽象类中的抽象函数和虚函数的区别:
    抽象函数的在子类中必须重写而虚函数可以不用。
    抽象函数不能有实现,而虚函数必须有实现

    虚函数在子类中没有override时就会出现父类中的函数
    虚方法可以出现在抽象类中也可以出现在其他类中

评分

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

查看全部评分

回复 使用道具 举报
抽象方法
        抽象方法不能有实现
        抽象类中的抽象方法必须在子类中全部override重写,除非子类也是抽象类
        抽象方法必须出现在抽象类中
虚方法
        虚方法必须有实现
        可以在子类中被重写
        可以出现在抽象类中,也可以出现在普通类中
这是它们的区别,理解它们有什么区别了,就知道怎么用了.
回复 使用道具 举报
虚拟方法和抽象方法有什么区别?

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现

虚拟方法有实现代码

抽象方法则没有,

并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类

抽象方法是虚拟方法的一种
抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法
如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为
抽象方法。

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现

补充一点

只允许在抽象类中使用抽象方法声明

学习

其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马