欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入理解C# abstract和virtual关键字

程序员文章站 2023-11-30 08:04:58
复制代码 代码如下: class a { public virtual void func() // 注意virtual,表明这是一个虚拟函数 { console.writ...
复制代码 代码如下:

class a
{
public virtual void func() // 注意virtual,表明这是一个虚拟函数
{
console.writeline("func in a");
}
}
class b : a // 注意b是从a类继承,所以a是父类,b是子类
{
public override void func() // 注意override ,表明重新实现了虚函数
{
console.writeline("func in b");
}
}
class c : b // 注意c是从b类继承,所以b是父类,c是子类
{
}
class d : a // 注意d是从a类继承,所以a是父类,d是子类
{
public new void func() // 注意new ,表明覆盖父类里的同名类,而不是重新实现
{
console.writeline("func in d");
}
}
class program
{
static void main(string[] args)
{
a a; // 定义一个a这个a类的对象.这个a就是a的申明类
a b; // 定义一个b这个a类的对象.这个a就是b的申明类
a c; // 定义一个c这个a类的对象.这个a就是c的申明类
a d; // 定义一个d这个a类的对象.这个a就是d的申明类
a = new a(); // 实例化a对象,a是a的实例类
b = new b(); // 实例化b对象,b是b的实例类
c = new c(); // 实例化c对象,c是c的实例类
d = new d(); // 实例化d对象,d是d的实例类
a.func(); // 执行a.func:1.先检查申明类a 2.检查到是虚拟方法 3.转去检查实例类a,就为本身 4.执行实例类a中的方法 5.输出结果 func in a
b.func(); // 执行b.func:1.先检查申明类a 2.检查到是虚拟方法 3.转去检查实例类b,有重载的 4.执行实例类b中的方法 5.输出结果 func in b
c.func(); // 执行c.func:1.先检查申明类a 2.检查到是虚拟方法 3.转去检查实例类c,无重载的 4.转去检查类c的父类b,有重载的 5.执行父类b中的func方法 5.输出结果 func in b
d.func(); // 执行d.func:1.先检查申明类a 2.检查到是虚拟方法 3.转去检查实例类d,无重载的(这个地方要注意了,虽然d里有实现func(),但没有使用override关键字,所以不会被认为是重载) 4.转去检查类d的父类a,就为本身 5.执行父类a中的func方法 5.输出结果 func in a
d d1 = new d();
d1.func(); // 执行d类里的func(),输出结果 func in d
console.readline();
}
}