首先我对上节课老师说的这几个关键字
virtual override new
进行了一下测试,用例就是老师上课讲的那个,自己在编译器上又实现了一遍
代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { class A { public virtual void Movie() { Console.WriteLine("In Class A"); } } class B : A { public override void Movie() { Console.WriteLine("In Class B"); } } class C : B { public new virtual void Movie() { Console.WriteLine("In Class C"); } } class D : C { public override void Movie() { Console.WriteLine("In Class D"); } } class Program { static void Main(string[] args) { A objA = new D(); A objB = new B(); C objC = new D(); A objD = new A(); objA.Movie(); objB.Movie(); objC.Movie(); objD.Movie(); Console.ReadLine(); } } }
为了更明显的看到运行结果把movie里面的输出改变成了 In Class X。。。结果如下
解释一下这个就是首先objA是一个A类型的对象,但指向的是他的子类一个D类型的,A中的movie是virtual所以我们往下找找到B里面的override,可以用,但是还有子类我们继续往下找找到C发现是个new virtual,编译器到这里截断不再往下找 所以用B中的函数
第二个因为B就是B的对象所以直接执行B类型的
第三个我们从C开始找C中的movie是virtual所以我们向下找到D,D中的可用并且没有子类我们停下输出D
最后一个A类型的A对象所以直接用A中函数即可
然后说一下这两个关键字
ref out
ref关键字就和类似于C++中的&的引用传递,在参数前面加上ref即可实现引用传递
举例代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { public static void TestRef(ref int a, ref int b , ref int c) { Console.WriteLine("In Ref"); a = 4; b = 5; c = 6; } public static void TestOut(out int a, out int b, out int c) { Console.WriteLine("In Out"); a = 1; b = 2; c = 3; } static void Main(string[] args) { int a , b , c ; TestOut(out a ,out b ,out c); Console.WriteLine("{0} {1} {2}", a, b, c); TestRef(ref a, ref b, ref c); Console.WriteLine("{0} {1} {2}", a, b, c); Console.ReadLine(); } } }
这里abc首先都没有被赋初值,然后在testOut中有了初值, 在testRef中做了更改。。。
结果不贴了。。。比较易读
关于Sealed关键字
阻止某个类/某个类中的函数被继承,如果类前面加了sealed
sealed class A { //balabala }
那么我们就没办法继承A这个class
如果sealed在某个类的某个函数前面那么这个函数将不能在派生类中被重写
关于overloading的相关上节课的笔记中已经写过不再赘述