虚方法是必须要实现的,只有接口或者抽象方法才没有实现体,什么是实现体,就是方法的那对大括号:下面举例:
public abstract void Fn1();//定义一个抽象方法
public vitrual void Fn2(){ };//定义一个虚方法(那对大括号必须要有,有说明已经实现了该方法,你可以具体定义他要实现的功能,也可以什么都不写)
虚方法是必须实现的,子类可以选择是否重写
抽象方法一定没有实现,而且必须在抽象类中,子类中必须重写。
应用举例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program : OnlineStepPageBase
{
static void Main(string[] args)
{
//Console.WriteLine( Fibonacci(30).ToString());
Program p = new Program();
p.TestRecipeData();
p.Fn1();
Console.ReadKey();
}
public override void TestRecipeData()
{
base.TestRecipeData();
Console.WriteLine("2");
}
public override void Fn1()
{
Console.WriteLine("3");
}
//private static long Fibonacci(int n)
//{
// long result = 1;//当n<=2时都返回1
// if (n > 2) //当n>2时,进行递归计算
// {
// result = Fibonacci(n - 1) + Fibonacci(n - 2);
// }
// return result;
//}
}
public abstract class OnlineStepPageBase
{
public virtual void TestRecipeData()
{
Console.WriteLine("1");
}
public abstract void Fn1();//定义一个抽象方法
}
}
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类。在抽象类中声明方法时,如果加上abstract关键字,则为抽象方法
02
—
抽象类概述及声明
抽象类主要用来提供多个派生类可共享的基类的公共定义,它与非抽象类的主要区别如下。
①抽象类不能直接实例化。
②抽象类中可以包含抽象成员,但非抽象类中不可以。
③抽象类不能被密封。
C#中声明抽象类时需要使用 abstract 关键字,具体语法格式如下:
访问修饰符 abstract class 类名:基类或横口
{
//类成员
}
说明
声明抽原类时,除abstract 关健字,class 关健字和类名外,其他的都是可选项。
【例1】声明一个抽象类,该抽象类中包含一个int类型的变量和一个无返回值类型方法。代码如下:
public abstract class myClass
{
public int i;
public void method()
}
03
—
抽象方法概述及声明
抽象方法就是在声明方法时,加上abstract 关键字,声明抽象方法时需要注意以下两点。
①抽象方法必须声明在抽象类中。
②声明抽象方法时,不能使用 virtual、static 和 private 修饰符。
抽象方法声明引入了一个新方法,但不提供该方法的实现,由于抽象方法不提供任何实际实现因此抽象方法的方法体只包含一个分号。
当从抽象类派生一个非独象类时,需要在非抽象类中重写抽象方法,以提供具体的实现,重写抽象方法时使用 override 关键字。
【例2】声明一个抽象类,该抽象类中声明一个抽象方法。代码如下:
public abstract class myClass
{
public abstract void method(): //抽象方法
}
04
—
抽象类与抽象方法的使用
本节通过一个实例介绍如何在程序中使用抽象类与抽象方法。
【例3】创建一个控制台应用程序,其中声明一个抽象类myClass,该抽象类中声明了两个属性和一个方法,其中,为两个属性提供了具体实现,方法为抽象方法。然后声明一个派生类 DriveClass,继承自 myClass,在 DriveClass 派生类中重写 myClass 抽象类中的抽象方法,并提供具体的实现。最后在主程序类 Program 的 Main 方法中实例化 DriveClass 派生类的一个对象,使用该对象实例化抽象类,并使用抽象类对象访问抽象类中的属性和派生类中重写的方法。
代码如下:
public abstract class myClass
{
private string id = "";
private string name ="";
public string ID //编号属性及实现
{
get
{
return id;
}
{
id = value;
}
}
public string Name //姓名属性及实现
{
get
{
return name;
}
set
{
name = value;
}
}
public abstract void Showinfo(); //抽象方法,用来输出信息
public class DriveClass:myClass //继承抽象类
{
public override void Showinfo() //重写抽象类中输出信息的方法
{
Console.WriteLine(ID+""+Name);
}
}
class Program
{
static void Main(string[] args)
{
DriveClass driveclass = new DriveClass(); //实例化派生类
myClass myclass = driveclass; //使用派生类对象实例化抽象类
myclass.ID=“BH0001” //使用抽象类对象访问抽象类中的编号属性
myclass.Name ="TM”; //使用抽象类对象访问抽象类中的姓名属性
myclass.Showinfo(); //使用抽象类对象调用派生类中的方法
}
}