zoukankan      html  css  js  c++  java
  • 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的相关上节课的笔记中已经写过不再赘述

  • 相关阅读:
    CMDB表结构设计
    mysql数据库密码
    web之提取状态码
    ELK的启动脚本
    ELK的轻量级搭建使用
    liunx安装JDK
    liunx的urandom生成随机字符
    vim快捷键
    升级系统的python程序
    Mysql的进阶小记
  • 原文地址:https://www.cnblogs.com/Durandal/p/4378597.html
Copyright © 2011-2022 走看看