class PersonnelV
{
public virtual void Visit(Officer o)
{
Console.WriteLine("I am Officer");
}
public virtual void Visit(Personnel p)
{
Console.WriteLine("Personnel");
}
}
class Personnel
{
public virtual void Accept(PersonnelV v)
{
v.Visit(this);
}
}
class Officer : Personnel
{
// public override void Accept(PersonnelV v)
// {
// v.Visit(this);
// }
}
class Test
{
public static void main()
{
Officer p = new Officer();
p.Accept(new PersonnelV());
}
}
{
public virtual void Visit(Officer o)
{
Console.WriteLine("I am Officer");
}
public virtual void Visit(Personnel p)
{
Console.WriteLine("Personnel");
}
}
class Personnel
{
public virtual void Accept(PersonnelV v)
{
v.Visit(this);
}
}
class Officer : Personnel
{
// public override void Accept(PersonnelV v)
// {
// v.Visit(this);
// }
}
class Test
{
public static void main()
{
Officer p = new Officer();
p.Accept(new PersonnelV());
}
}
一、超类的非virtual方法,子类用new关键字改写,这用中文理解叫覆盖(子类中超类的同名方法还在只是不能直接用)
二、超类的virtual方法,子类用override关键字改写,这用中文理解叫重写(子类中超类的同名方法被替换了)
例:
using System;
class A
{
public void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B: A
{
new public void F() { Console.WriteLine("B.F"); }
public override void G() { Console.WriteLine("B.G"); }
}
class OverrideTest
{
static void Main() {
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
}
因为 Officer类没有重写Personnel类的Accept方法
为什么会输出Personnel呢,证明Visit(Personnel p)传进给Visit的是一个Personnel类型的对象
那么加一句 Console.WriteLine(this.GetType().ToString())在Accept里面,可以看到输出是Officer
这不是证明在Accept里面this是Officer类型吗?怎么会调用Personnel类型参数的Visit呢?是不是在类里面不管是virtual还一般函数里面的this其实都是一个该类的类型呢?那么上述的this是Officer又何解?