C#笔记第三节课

首先我对上节课老师说的这几个关键字

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的相关上节课的笔记中已经写过不再赘述

原文地址:https://www.cnblogs.com/Durandal/p/4378597.html