protected的使用注意
在c#的可访问性级别中,public和private算是最容易理解的,相反protected往往令人非常头疼。经常在网上查资料的朋友往往会发现,
答案几乎都是前篇一律,不是从msdn上拷贝的就是从别人的博客上抄袭的,简直是天下文章一大抄,今天咱们就来点和别人不同的,通过例子来透析一下
protected访问修饰符到底是怎么回事。
下面先来看一下,protected访问修饰符在大多数资料中的定义:访问仅限于包含类或从包含类派生的类型。搞明白问题只靠眼看是不行的,需要实践,现
在我们用事实来说明问题。
代码如下:
class BaseTest
{
public int a = 10;
protected int b = 2;
}
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 = 10;
protected int b = 2;
}
class ChildTest : BaseTest
{
int c;
int d;
static void Main(string[] args)
{
BaseTest basetest = new BaseTest();
ChildTest childTest = new ChildTest();
Console.WriteLine(childTest.b);
}
}
总结:
在继承一个基类时,成员的可访问性就出现了一个问题:
private:只有基类可以访问,派生类和外部都不能访问
public:基类,派生类和外部都能访问
因此 提供了一个protected 访问标识符,基类 和派生类都能访问被protected修饰的成员,而外部无法访问。
protected的使用注意的更多相关文章
- 关于类protected、private、public的方法
今天在写代码的时候发现了一种情况,(TP框架)有一个model类 AdminModel.class.php class AdminModel extends Model{ protected $_ ...
- Java中private、protected、public和default的区别
public: 具有最大的访问权限,可以访问任何一个在classpath下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. protected: 主要的作用就是用来保护子 ...
- Java/C++之 public、protected、private ; virtual & abstract
一.绪 Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆.本文总结了一些这两门语言的差异之处,仅供参考. 二.C++ 对于C++这门语言,就其类 ...
- 为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default
对于java程序员来说,java的访问权限修饰词public.protected.default.private的区别和使用肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把.最近在整理java ...
- Java中的private protected public和default的区别
转至:http://blog.sina.com.cn/s/blog_74c571240101jaf5.html 类内部 本包 子类 外部包 public √ √ √ √ pro ...
- C++中public、protected及private用法
转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...
- java protected 的细节
1. java的权限控制--大部分人都被错误洗脑了. 一个重大的坑,或者一个重大的误区,或者说一个洗脑了成千上万java编程者的错误概念就是: public private protected 是基于 ...
- c# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.
c# 调用C++的dll报错 Attempted to read or write protected memory: 原因是:c# 传递Null的string值导致的,将Null改为string ...
- MIT 6.828 JOS学习笔记6. Appendix 1: 实模式(real mode)与保护模式(protected mode)
在我们阅读boot loader代码时,遇到了两个非常重要的概念,实模式(real mode)和保护模式(protected mode). 首先我们要知道这两种模式都是CPU的工作模式,实模式是早期C ...
- protected $appends in Laravel
protected $appends = ['icon']; public function getIconAttribute(){ return Gravatar::src($this->em ...
随机推荐
- weblogic.nodemanager.common.ConfigException: Native version is enabled but nodemanager native library could not be loaded 解决办法
近日在一个原本工作正常的weblogic web server(操作系统为redhat 64位系统)上折腾安装redis/hadoop等东东,yum install了一堆第3方类库后,重启weblog ...
- grunt使用入门(zz)
下面介绍grunt的基本使用方法,把前端项目中的对个js文件,合并到一起,并压缩. 注意,例子用的是grunt 0.4.5版本,低版本可能在配置上有所不同. 工具/原料 node 方法/步骤 首先用n ...
- 【转】CSS样式覆盖规则
大家都知道CSS的全称叫做“层叠样式表”,但估计很多人都不知道“层叠”二字的含义.其实,“层叠”指的就是样式的覆盖,当一个元素被运用上多种样式,并且出现重名的样式属性时,浏览器必须从中选择一个属性值, ...
- C#基础之泛型
1.泛型的本质 泛型的好处不用多说,在.NET中我看到有很多技术都是以泛型为基础的,不过因为不懂泛型而只能对那些技术一脸茫然.泛型主要用于集合类,最主要的原因是它不需要装箱拆箱且类型安全,比如很常用的 ...
- .Net分布式异常报警系统-项目介绍
后台管理 首页统计的是当天每个时段的异常数量, 使用的是echarts组件, 红框所示, 可以选择不同的系统进行查看. 得益于echarts的强大功能, 你可以使用柱状图来查看. 站 ...
- 前端框架——AmazeUI学习
AmazeUI官网: http://amazeui.org/ 前后台模板下载:链接:链接:http://pan.baidu.com/s/1c2uVfk0 密码:zuva 十大前端框架参考链接:http ...
- SqlServer中——查找杀死阻塞进程
查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM ...
- 为什么我们要给父级元素写overflow:hidden
有这样的一种情况,有的时候,我们的父级元素设置了高度,一般来说,父级元素的高度是根据子元素的高度来自适应撑开的,如果我们的父级元素也设置了高度,那么其高度就不会随着子元素的的大小而自适应,也许有的时候 ...
- iOS 自定义NavigationBar右侧按钮rightBarButtonItem--button
//两个按钮的父类view UIView *rightButtonView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; //历史浏览按钮 ...
- SharePoint Web Part Error – The Specified Solution Was Not Found
If you develop, release and add a SharePoint 2010 sandboxed solution web part to a page, then change ...