1)虚函数 virtual
virtual用于在基类中修饰方法,允许在派生类中使用override关键字重写方法
默认情况下,方法是非虚拟的。 不能替代非虚方法。v
irtual 修饰符不能与 static、abstract、private 或 override 修饰符一起使用。
virtual 方法有方法体,只是要求在派生类中进行override选择性重写操作。
2)抽象方法 abstract
抽象方法是在基类中声明,但没有提供具体的实现,而是在派生类中实现。它们用于强制派生类提供特定的方法实现。
抽象类中有抽象方法,也可以没有抽象方法,抽象方法只存在于抽象类中,不存在于普通类中
抽象类不能被实例化,作为基类,派生类的模版,抽象类中可以包含抽象方法和非抽象方法。
抽象方法abstract和virtual虚方法的区别
1)虚方法必须有实现部分,抽象方法不可以有实现部分
2)虚方法可以在派生类中重写,也可以不重写,抽象方法必须在派生类中重写。
3)虚方法可以在任何非密封类中身影,抽象方法只能在抽象类中进行声明
4)如果类包含抽象方法,则该类必须为抽象类,不能被实例化
虚方法倾向于代码复用,抽象方法约束子类必须实现某方法
虚方法的使用例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VirtualMethod01
{
//虚方法的示例
//virtual方法
public class BaseClass
{
public virtual void Display()//基类中的虚方法
{
Console.WriteLine("BaseClass Display");
}
}
public class DerivedClass : BaseClass//派生类从基类中继承
{
public override void Display() //override重写基类中的虚方法
{
Console.WriteLine("DerivedClass Dispaly");
}
}
internal class Program
{
static void Main(string[] args)
{
BaseClass bsc = new BaseClass();
bsc.Display();
DerivedClass ddc = new DerivedClass();
ddc.Display();//输出override的内容
BaseClass bsc2 = new DerivedClass();
//通过基类的引用调用派生类的实列时候,根据多态,会执行派生类中的版本
bsc2.Display(); //输出override的内容
}
}
}
抽象方法的使用的例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
//抽象方法的例子
namespace AbstractMethod
{
public abstract class Shape //含有抽象方法是抽象类
//抽象类不能实例化
{
public abstract double Area(); //抽象方法没有方法体
public abstract string Name { get; set; } //抽象属性没有具体实现
}
public class Rectangle : Shape
{
private string name;
public override string Name//实现抽象属性
{
get { return name; }
set { name = value; }
}
private double width;
private double height;
public double WIDTH
{
get { return width; }
set { width = value; }
}
public double HEIGHT
{
get { return height; }
set { height = value; }
}
public override double Area()//子类中重写抽象类中的抽象方法
{
return width * height;
}
}
internal class Program
{
static void Main(string[] args)
{
Rectangle rt = new Rectangle();
rt.WIDTH = 100;
rt.HEIGHT = 200;
Console.WriteLine(rt.Area());
}
}
}