黑马程序员技术交流社区

标题: 什么时候用虚方法 什么时候用抽象? [打印本页]

作者: q4486233    时间: 2013-5-19 23:51
标题: 什么时候用虚方法 什么时候用抽象?
什么时候用虚方法 什么时候用抽象?

作者: mosuge7    时间: 2013-5-20 00:08
父类中的方法是通用虚方法,可以在子类中重写以重新规定方法逻辑,即:在子类继承基类的时候需要对其重写。
抽象方法一般用在抽象类或接口中。
作者: 王朋    时间: 2013-5-20 09:19
先说说两者的区别:1、虚方法必须有实现部分,抽象方法不可以有实现部分;2、虚方法可以在派生类中重写也可以不重写,抽象方法必须在派生类中重写3、虚方法可以在任何非密封类中声明,抽象方法只能在抽象类中声明。4、如果类包含抽象方法,那么该类也必须为抽象的,不能实例化。
相比而言,虚方法倾向于代码复用,抽象方法更类似一种规约来约束子类必须实现某方法。
举个例子(未必恰当、只为说明问题):  比如有个基类“动物”;两个子类“狮子”、“青蛙”。   
狮子捕猎:锁定目标、用牙齿和利爪抓获;    狮子说话:噢呜;   
青蛙捕猎:锁定目标、用舌头抓获;    青蛙说话:呱呱;  
对于捕猎,他们有共性也有区别:    所以就可以把捕猎声明为虚方法,基类里实现共性部分、各子类实现个性部分;  对于说话,完全不同,但是又必须让他们说话。    所以就可以把说话声明为抽象方法,基类只声明此方法来作为约束,强制子类实现。
作者: 向德伟    时间: 2013-5-20 10:12
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;
虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。
重写的子类虚函数就是被覆盖了。

楼主好好看看
作者: 郎吉祥    时间: 2013-5-20 12:32
本帖最后由 郎吉祥 于 2013-5-20 12:34 编辑

简单来说,抽象方法只能用在接口和抽象类中,虚方法可以用在任意地方(除了密封类和接口)。
至于什么时候用那种,还是根据你自己的理解来用吧,大致上是一样的功能。
作者: 许大虾    时间: 2013-5-20 13:44
这些都是定义一个规范!虚方法是在子类继承基类的时候需要对其重写。抽象方法一般用在抽象类或接口中!!
作者: 秦二江    时间: 2013-5-20 16:12
说抽象方法 前先说抽象类
抽象类
在类被创建的时候,派生类的构造函数在执行前,会首先执行基类的构造函数
基类往往是不完善的,也不应该把基类的类成员实例化 :
例如: person (人类):Animal(动物), 不应该直接从  Animal(动物)类创建对象
抽象类的作用:阻止基类的直接实例化


抽象方法 :抽象类中的所有方法不一定全是抽象方法,但是包含抽象方法的类被称作抽象类,即抽象方法一定是在抽象类中的
抽象方法 没有方法体,即方法没有 具体实现
同样 不允许包含 { }

例如:
public abstract class Animal //编写类
{
public abstract string Sound(); //创建抽象方法
}

抽象方法的 实现 必须 让派生类实
在派生类中,必须实现基类中的抽象方法
在派生类中,必须使用override 关键字,来实现抽象的方法
    来表示此方法 是对基类的抽象方法的实现

public class People:Animal //派生自Animal 类
{
public string country;
public override string Sound() //实现抽象方法
{
return "language"; //返回值
}
}

在类设计中,对于多数的派生类使用的方法,可以考虑将方法放置在基类中,当一个方法,
例如飞行,有一些派生类不需要使用,如人类,则可以将此方法设置为虚方法。而当一个方法,例如吃
东西,是每个派生类都必须使用的,则最好将此方法设计为抽象方法,强制每个开发人员必须实现该方

  虚方法:
为什么要有虚方法:
使用abstract 关键字修饰类为抽象类,那么在基类中就不需要实现抽象类,而必须在派生类中实现基类的方法。但是,如果在基类中,有多个方法来形容一个动物的特性,如飞行的
特性可以用来形容鸟,而世界上很多动物都会飞行,但是人类是无法飞行的,所以在人类这个派生类中实现飞行的方法是没有必要,也是降低的代码的可读性的。
语法:virtual 关键字实现虚方法,虚方法是让派生类能够选择是否实现该方法,可是实现也可以不实现,但抽象方法一定要实现
public class Animal //创建类
{
public virtual string Fly() //虚方法,飞行方法
{
return "Most Of The Animal Can Fly"; //返回值
}
}
public class People:Animal //创建派生类
{
public string country; //没有实现虚方法也可以
}
public class Bird : Animal //创建派生类
{
public string FLY() //鸟儿能飞行,实现一个虚方法
{
return "It Can Fly"; //返回值
}
}
上述代码中,人类不能飞行,所以没有必要实现Fly()方法,而鸟儿可以飞行,为了更好的描述一个对象,可以实现Fly()方法让对象能够飞行。

作者: 秦二江    时间: 2013-5-20 16:15
回答您的问题,我对这块知识的理解又加深了,感谢您
作者: 黑马—杨磊    时间: 2013-5-21 09:54
虚方法,在父类里面是有代码的,那么如果没子类,父类依然可以干活,如果子类override了这个虚方法,子类的方法将替代这个方法。抽象方法,在父类里面是个没实现的东西,更加像个说明,子类必须实现这个方法的内容,不然子类也要声明为抽象类。 简单的说,如果你感觉父类的这个方法可以有代码,那么把他声明为虚的,如果你感觉,父类是个超级抽象的概念,方法没有实现代码,需要子类自己实现,那么你用抽象方法。
作者: 盘晟    时间: 2013-5-21 11:13
虚方法:
1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
2、virtual方法可以直接使用,和普通方法一样
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写 virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法
没有什么区别 相应的 sealed关键字标示此方法不可以被重写

抽象方法:
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法

虚方法和抽象方法的区别:
1.虚方法可以有实现体,抽象方法不能有实现体。
2.抽象方法 要求派生类必须重载这个方法;省略了抽象类myClass,以下代码为在派生出来的类中重写抽象类myClass的抽象方法ShowwInfo():
  public class DriveClass:myClass                     //继承抽象类
    {
        /// <summary>
        /// 重写抽象类中输出信息的方法
        /// </summary>
        public override void ShowInfo()
        {
            Console.WriteLine(ID + " " + Name);
        }
    }






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2