1、virtual函数声明时需要有实现,子类可以重写该函数,也可以不重写,直接从基类继承;
2、abstract函数声明时没有实现,子类必须重写该函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace KeyWords
{
class MyBase
{
// 必须有实现
public virtual string GetClassName()
{
return this.GetType().ToString();
}
public void TestOverload()
{
Console.WriteLine("Base overload");
}
}
class MyDerived : MyBase
{
// 可以不重写
// public override string GetClassName()
// {
// return this.GetType().ToString();
// }
// 与基类无关重写
public new void TestOverload()
{
Console.WriteLine("Derived overload");
}
public void TestOverload(string param)
{
Console.WriteLine("Derived overload:{0}", param);
}
}
abstract class MyAbstract
{
// 无实现
public abstract string GetClassName();
}
class MyADerived : MyAbstract
{
// 必须重写
public override string GetClassName()
{
return this.GetType().ToString();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace KeyWords
{
class Program
{
static void Main(string[] args)
{
MyBase b = new MyBase();
string className = b.GetClassName();
Console.WriteLine(className);
b.TestOverload();
Console.WriteLine();
b = new MyDerived();
className = b.GetClassName();
Console.WriteLine(className);
b.TestOverload();
Console.WriteLine();
MyDerived d = new MyDerived();
className = d.GetClassName();
Console.WriteLine(className);
d.TestOverload();
d.TestOverload("2");
Console.WriteLine();
MyADerived a = new MyADerived();
className = a.GetClassName();
Console.WriteLine(className);
Console.ReadKey();
}
}
}