1、virtual方法在类设计中起什么作用啊(也就是为什么要把方法定为虚拟的)
2、virtual方法可以直接使用吗?它有方法体啊
3、virtual方法必须在子类中重写吗?如可以不重写,那么子类可以这个virtual方法吗?

解决方案 »

  1.   

    在C#中,
    如果声明一个方法的时候用了virtual这个关键字,那么,在派生类中,就可以使用override或者new关键字来重写(弃用)它或是隐藏(忽略)它.
    如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报警告错误,并将以new方式,即忽略派生类中的方法的方式来运行。
     
    废话少说,还是以代码说话:
     
    /// <summary>
    /// 抽象类书
    /// </summary>
    public abstract class Book
    {
        /// <summary>
        /// 书名
        /// </summary>
        public string bookName;
        /// <summary>
        /// 虚方法,获取书名
        /// </summary>
        public virtual string getBookName()
        {
            return "这本书名是:"+bookName;
        }
        /// <summary>
        /// 虚方法,获取书出版社
        /// </summary>
        public virtual string getBookCome()
        {
            return "cn-web.com出版<br>";
        }
    }
    /// <summary>
    /// 书的派生类
    /// </summary>
    public class NetBook : Book
    {
        /// <summary>
        /// 重写虚方法override
        /// </summary>
        public override string getBookName()
        {
            return bookName;
        }
        /// <summary>
        /// 不用override,可以不写new,但会引起警告错误,编译时系统会自动为它加上new关键字
        /// </summary>
        public string getBookCome()//正规应当为:public new string getBookCome(),在这里省略了new关键字
        {
            return "www.cn-web.com出版<br>";
        }
    }
     
    调用:
     public class test
        {
            public test()
            {
                NetBook myNetBook = new NetBook();
            myNetBook.bookName = "asp.net开发案例<br>";
            Response.Write(myNetBook.getBookName());
            Response.Write(myNetBook.getBookCome());
             Book myBook = new NetBook();
            myBook.bookName = "asp.net基础开发<br>";
            Response.Write(myBook.getBookName());
            Response.Write(myBook.getBookCome());        }        public static void Main()
            {
                test t = new test();
            }
        }
      

  2.   

    记住,有virtual一般都有override的,virtual在基类里写,override写在派生类里,为了覆盖基类里的同名方法
      

  3.   

    设计一个系统,为了使开发很加清析,代码维护性,灵活好,往往要用到虚方法,重载,接口,抽象类等技术
    virtual 方法是程序程序多态表现形式的一种而
    同一方法
    在不同的类里面有不同的现实
      

  4.   

    我试过了,基类里面的virtual方法,在子类中可以没有override重写,并且在子类中也可以访问基类的virtual方法。我维一感觉到的一点就是可以实现多态。但觉得接口在这方面更好一点,至少在UML里面是使用的接口,没有看到什么virtual方法
      

  5.   

    1.楼上你说的至少在UML里面是使用的接口,那是在UML中设计模式,但在C#中这个有特殊的用处。
    2.说这些方法时最好说的能俗点,有例子说明为最好。
    3.我同意一楼的方法
      

  6.   

    1、virtual方法在类设计中起什么作用啊(也就是为什么要把方法定为虚拟的) 
    2、virtual方法可以直接使用吗?它有方法体啊 
    3、virtual方法必须在子类中重写吗?如可以不重写,那么子类可以这个virtual方法吗?1 virtual这种方法其实是抽像出了我们在类设计中共有的一些操作,为什么要把它设为虚的呢,因为在我们共同的父类中,这个方法具体是实现什么功能我们并不能现在就确定,这只能让我们的子类来继承并且实现它,因为这个子类可以继承并且实现它,其它子类也可以做这样的事,所以很多类都要有这个功能,但具体的实现细节不同,所以我们把它放到一个共同的基类中,让我们的子类来继承实现,具体的不同就是让子类来实现自己的操作。
    2,如果这个虚方法出来在一般的类中并且实现了功能那就可以在实例中直接使用,如果出现在抽象类中,那就不能真接使用了,因为抽象类不能用NEW()来创建,这有点像C++中的纯虚函数。
    3 可以不在类中重写,如果不重写好它还是一个虚方法,在一般类中声明的虚方法是可以真接使用的
      

  7.   

    1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑. 
    2、virtual方法可以直接使用,和普通方法一样
    3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别
    相应的
    sealed关键字标示此方法不可以被重写
      

  8.   

    virtual关键字表示这个方法可以被子类override。
    如果子类里的方法和父类的内部实现不同,那么就去override这个方法。反之,如果子类中的实现方式和父类一样,那就直接使用继承自父类的方法就ok了。
      

  9.   

    没有加 virtual 关键字的public或者protocted 方法
    在子类中总是可见,而且不能被替换或修改。
    如果这个方法在子类中需要不同的执行。那就加virtual加关键字。
      

  10.   

    yohomonkey 在帖子里已经讲的很清楚了。我再来补充一点。如果楼主熟悉设计或者自己写过框架,虚方法还有种作用就是当做扩展点来使用。比如有一个业务流程,需要执行a b c三个步骤,有很多其它的流程也是执行这三个步骤。但只是B步骤执行的功能不一样。这时可以把流程抽像出来。然后把B方法设置成虚方法。这样其它类继承这个流程类就可以随意改变B步骤的内容并保持原有的流程不变.  public class Flow
        {
            public void A()
            {
                //执行步骤A
            }        public virtual void B()
            {
                //执行步骤B
            }        public void C()
            {
                //执行步骤C
            }        public void Run()
            {
                A();
                B(); //步骤B是扩展点 ,可以由子类决定具体执行什么
                 C();
            }
        }    public class FlowA:Flow
        {
            public override void B()
            {
                //执行FlowA的B步骤
            }
        }    public class FlowB : Flow
        {
            public override void B()
            {
                //执行FlowB的B步骤
            }
        }FlowB flowB = new FlowB();
    flowB.Run();  //复用了Flow的流程并采用了自己的B步骤
    不知道这样讲楼主是不是清楚些了.
      

  11.   

    学习 
    总结意思就是virtual 就是为了子类的override,但是也可通过base.function()调用
          
      

  12.   

    在C#中,虚方法的作用是,让子类明确某一个方法是会覆盖父类的同名方法,从而避免不必要的错误。
    和抽象方法的相同点是都用了override关键字,
    不同点是抽象方法必须存在于抽象类中,而子类必须重写,除非子类也是抽象的。其它:
    在JAVA中是没有虚方法的。在JAVA中,是通过注解@override来达到类似的目的。两种技术的相同点:
    没有这种技术,则子类写的方法可能会在不注意的情况下重写了父类的方法。
      

  13.   

    补充说明一下,本人做java 多年,今天是学习C#的第一天。讲得不对的地方,还请见谅。