【转】C#中protected用法详解
https://www.cnblogs.com/wangyt223/archive/2012/08/08/2627801.html
在c#的可访问性级别中,public和private算是最容易理解的,相反protected往往令人非常头疼。经常在网上查资料的朋友往往会发现,
答案几乎都是前篇一律,不是从msdn上拷贝的就是从别人的博客上抄袭的,简直是天下文章一大抄,今天咱们就来点和别人不同的,通过例子来透析一下
protected访问修饰符到底是怎么回事。
下面先来看一下,protected访问修饰符在大多数资料中的定义:访问仅限于包含类或从包含类派生的类型。搞明白问题只靠眼看是不行的,需要实践,现
在我们用事实来说明问题。
代码如下:
class BaseTest
{
public int a = ; protected int b = ;
}
class ChildTest:BaseTest
{
int c;
int d; public void printTest()
{
BaseTest basetest = new BaseTest(); this.a=basetest.a; this.c = basetest.b;//这句有错误
}
}
这段代码中派生类中的方法的最后一行代码会报错:无法通过类型“protectedtest.Vehicle”的限定符访问保护成员
“protectedtest.Vehicle.weight”;限定符必须是类型“protectedtest.Car”(或者从该类型派生)。看到这
里就会有很多人要问了,不是说protected类型的访问仅限于包含类或者从包含类派生的类型吗,为什么这里还是要报错呢,下面就来说明一下,包含类能
够使用protected类型的应该是没有任何问题了,这里就不用说了,主要问题就是集中在为什么在上面的那个例子中基类的实例为什么不能够访问
protected类型的变量,这里就涉及到对protected类型的理解,protected类型并不是能够被派生类所访问就是随心所欲的访问,而是
有条件的,访问必须是通过派生类类型发生时,在派生类中的基类的protected类型成员才能够被访问,这里就很清楚了上面的代码并不是通过派生类的类
型访问的,而是通过基类的类型访问的,此时此刻,protected和private十分的相似,只不过,protected类型成员能够被派生类所继承
并且能够通过派生类类型访问罢了。
改成如下形式就正确了,不过大家不过拘泥于这两个代码的形式,要看透到底是说明了个什么问题.
class BaseTest
{
public int a = ; protected int b = ;
} class ChildTest : BaseTest
{
int c; int d; static void Main(string[] args)
{
BaseTest basetest = new BaseTest(); ChildTest childTest = new ChildTest(); Console.WriteLine(childTest.b);
}
}
【转】C#中protected用法详解的更多相关文章
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- C++中const用法详解
本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...
- c/c++中define用法详解及代码示例
https://blog.csdn.net/u012611878/article/details/52534622 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...
- Spring中@Async用法详解及简单实例
Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类 ...
- AngularJS中transclude用法详解
这篇文章主要介绍了AngularJS中transclude用法,详细分析了transclude的具体功能.使用技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了AngularJS中transcl ...
- Elasticsearch——Date Math在索引中的用法详解
在elasticsearch中,有时会想要通过索引日期来筛选查询的数据,此时就需要用到日期数学表达式. 更多内容参考Elasticsearch翻译汇总 基于日期数学表达式的索引 模式如下: <s ...
- PHP中header用法详解带范例(转)
header的用法 header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端.标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的 ...
- Python中enumerate用法详解
enumerate()是python的内置函数.适用于python2.x和python3.xenumerate在字典上是枚举.列举的意思enumerate参数为可遍历/可迭代的对象(如列表.字符串)e ...
随机推荐
- SuperSocket特点
² 简单易用,只需要几个类就能创建出健壮的Socket服务器端程序 ² 性能优良, 稳定可靠 ² 支持各种协议, 内置的协议解析工具让你把实现通信协议这种复杂的工作变得很简单 ² 自动支持SS ...
- avalon2 第一个demo
<!DOCTYPE html> <html> <head> <title>TODO supply a title</title> <m ...
- 2006年NOIP普及组复赛题解
题目涉及算法: 明明的随机数:简单模拟: 开心的金明:01背包: Jam的计数法:模拟: 数列:二进制. 明明的随机数 题目链接:https://www.luogu.org/problem/P1059 ...
- SELinux: Could not downgrade policy file
在配置nfs服务器,设定selinux时,碰到了SELinux: Could not downgrade policy file的错误提示,下文是其解决方案. 一.故障现象 [root@system1 ...
- Javassist指引(一)
目录 原文链接 1. 读写字节码 1.1概述 Javassist是一个Java字节码类库.Java的字节码是包含Java类与接口,并按照一定的顺序存在class文件中. Javassist.CtCla ...
- Java中方法的格式
[修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……]) { 执行语句; [return 返回值;]//需要的话 } 参数列表(参数的类型 ...
- [转]如何让多个不同类型的后端网站用一个nginx进行反向代理实际场景分析
前段时间公司根据要求需要将聚石塔上服务器从杭州整体迁移到张家口,刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合,断断续续一个月迁移完 成大概优化掉了1/3的机器,完成之后遇到了一些问题,比如曾今 ...
- python编程之操作系统基础
操作系统发展史: 最早的计算机没有操作系统的概念:是使用打孔机和打孔卡片来进行计算的.只能一个一个处理. 后来产生了批处理系统,可以批量处理,进而加快计算的速度. 批处理系统:串行 数据处理速度加快 ...
- P1066 汪老师玩卡片
题目描述 汪老师得到了一些卡片,这些卡片上标有数字0或5.现在他可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被90整除这个条件.同时这个数不能含有前导0,即0不能作为这串数的首 ...
- 备战省赛组队训练赛第十六场(UPC)
传送门 题解: by 烟台大学 (提取码:8972)