今天学习了一些Virtual 的用法
以前也用过Virtual ,Override等方法 ,但一直也没有想过在什么时候用这些方法,只是一味的copy代码,导致现在对这些概念也一直很模糊。这2天实在是因为看到robin代码中用了太多的 virtual 方法 ,所以才下定决心要弄清楚。
我做了以下的试验:
public class Base
{
public string AccoutInfo()
{
system.console.writeline("Base AccoutnInfo!");
}
}
public class Student:Base
{
public string AccoutInfo()
{
system.console.writeline("Student AccoutInfo");
}
}
static void Main(string[] args)
{
OOStudy.Student student = new OOStudy.Student();
Console.WriteLine(student.AccoutInfo());
}
Result:Student AccoutInfo // 输出子类的信息
public class Base
{
public vitual string AccoutInfo()
{
system.console.writeline("Base AccoutnInfo!");
}
}
public class Student:Base
{
public override string AccoutInfo()
{
system.console.writeline("Student AccoutInfo");
}
}
static void Main(string[] args)
{
OOStudy.Student student = new OOStudy.Student();
Console.WriteLine(student.AccoutInfo());
}
Result:Student AccoutInfo // 输出子类的信息
同时我也把Student 中的 override 去掉了,发现输出的结果还是一样的
这个时候,我就很纳闷了 ,这个结果一直都是子类的,根本没什么影响啊!
只能在网上找资料了,发现讲vitual 的,都是 OOStudy.Base student = new OOStudy.Student(); 初始化一个类
我就这样跟着改了之后,发现结果出现了变化。
public class Base
{
public vitual string AccoutInfo()
{
system.console.writeline("Base AccoutnInfo!");
}
}
public class Student:Base
{
public string AccoutInfo()
{
system.console.writeline("Student AccoutInfo");
}
}
static void Main(string[] args)
{
OOStudy.Base student = new OOStudy.Student();
Console.WriteLine(student.AccoutInfo());
}
Result:Base AccoutnInfo! //输出父类的信息
public class Base
{
public string AccoutInfo()
{
system.console.writeline("Base AccoutnInfo!");
}
}
public class Student:Base
{
public string AccoutInfo()
{
system.console.writeline("Student AccoutInfo");
}
}
static void Main(string[] args)
{
OOStudy.Base student = new OOStudy.Student();
Console.WriteLine(student.AccoutInfo());
}
Result:Base AccoutnInfo! //输出父类的信息
public class Base
{
public vitual string AccoutInfo()
{
system.console.writeline("Base AccoutnInfo!");
}
}
public class Student:Base
{
public override string AccoutInfo()
{
system.console.writeline("Student AccoutInfo");
}
}
static void Main(string[] args)
{
OOStudy.Base student = new OOStudy.Student();
Console.WriteLine(student.AccoutInfo());
}
Result:Student AccoutInfo //重写了父类的方法 ,输出子类的信息
看到这些结果后,我知道了子类转化为父类的时候 ,如果父类用了virtual 方法,子类中用了override方法,就输出子类的信息,其他的情况都是输出父类的信息。
这个时候我还一下子没有明白过来是怎么一回事,只能想我以前是在什么情况下用过override方法了。在sharepoint 中开发webpart ,对事件的处理的时候, 都用到override方法,事件的override方法 的类是会继承一个SPItemEventReceiver 的类,想到这些后,我又想到了SPItemEventReceiver类中会对应一个virtual的方法 ,在我写完了这些方法的时候,我会把事件注册到一个对应的sharepoint的listItem中。这个时候我就有点明白了,其实注册的过程就是为了把父类和子类的方法联系起来,实现一个OOStudy.Base student = new OOStudy.Student();的关系,这样我们就能够完成我们的2次开发了。这个用法基本上就是这样的了