博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#笔记第三节课
阅读量:6222 次
发布时间:2019-06-21

本文共 2516 字,大约阅读时间需要 8 分钟。

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

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

你可能感兴趣的文章
mono for android software自动更新
查看>>
Android开发之Retrofit+RxJava的使用
查看>>
源码实现lamp环境搭建的详细过程
查看>>
转vim用法
查看>>
Linux xargs命令
查看>>
我的友情链接
查看>>
Django中的request.GET和request.POST
查看>>
Android开发文档学习:NFC(近场通讯)
查看>>
站长工具导航
查看>>
Java基础-字符串
查看>>
Eclipse快捷键个人记录
查看>>
版本管理工具——Git和TortoiseGit(乌龟Git)
查看>>
【转】iOS 消息推送原理及实现Demo
查看>>
交换机VTP通告配置
查看>>
linux创建普通用户和管理员用户
查看>>
继承中构造函数和析构函数的调用顺序
查看>>
MySQL-MySQL中int(M)和tinyint(M)数值类型中M值的意义
查看>>
初始ant
查看>>
Web登录中的信心安全问题
查看>>
MySQL Proxy 实现 MySQL 读写分离提高并发负载
查看>>