【求高手指点】C#中protected用法和private用法怎么有些地方这么相同??

dabing69221 2012-06-23 06:30:31
protected用法是:访问仅限于包含类或从包含类派生的类型;

private用法是:访问权限仅限于此类中;

下面是我写了一个简单代码,令我不解的是:如果在父类中声明一个属性用protected修饰,我在子类中如果想调用父类中被protected修饰的属性时,必须先将父类中的被protected修饰的属性进行封装才可以。

如果不对父类中被protected修饰的属性进行封装的话:
程序就会报错:“错误 无法通过类型“ConsoleApplication3.BaseTest”的限定符访问保护成员“ConsoleApplication3.BaseTest.b”;限定符必须是类型“ConsoleApplication3.ChildTest”(或者从该类型派生)的“

这是为什么啊?怎么protected的用法和private的用法都一样啊??搞不懂啊!!(以下是代码)



using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
/// <summary>
/// 父类
/// </summary>
class BaseTest
{
public int a = 10;
//如果不对protected b进行封装的话,会报错
protectedint b = 2;

}
}



using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
/// <summary>
/// 子类
/// </summary>
class ChildTest:BaseTest
{
int c;
int d;
public void printTest()
{
BaseTest basetest = new BaseTest();
this.a = basetest.a;
//当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
this.c = basetest.b;
}
}
}



...全文
453 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2012-06-24
  • 打赏
  • 举报
回复
最可笑的是一群人居然煞有介事“回答”这个问题。

另外什么“封装”,谁告诉你将字段写成属性就叫“封装”的???
threenewbee 2012-06-24
  • 打赏
  • 举报
回复
开玩笑。

你老酒喝多了?这个和什么private以及prodected都没有关系。

原因是你根本就没搞清楚限定符是做什么的。

比如说private,它的作用是使得成员变量私有。成员变量是什么???怎么可能是另一个对象的成员变量呢?

比如说:
class A
{
private int a = 0;
public void foo(A other_a)
{
a = 1; // a是成员变量
other_a.a = 2; // error, 这个a分明是另一个对象的,关成员变量什么事情?!
}
}


这好比说钱包对于一个人来说是私有的。那当然是指张三的钱包对于张三来说是私有的,李四的钱包对于李四是私有的。你怎么会觉得只要是人,都可以看见钱包都能拿,张三能拿李四的钱包么?

所以表面上看你是不懂语法,实际上你根本就不知道面向对象是什么,你要用程序做什么。
__天涯寻梦 2012-06-24
  • 打赏
  • 举报
回复
字段的直接访问被认为不安全,所以采用属性来间接的访问,大部分情况下都没什么作用
dabing69221 2012-06-24
  • 打赏
  • 举报
回复
那这样做有什么作用啊啊
__天涯寻梦 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
不是我不懂为什么 我书上写了一个 用protected修饰的字段 然后 有把这个字段封装成属性;
如: protected string Name{get;set;}
我知道这是用了一个自动属性,但是我不懂,父类中的属性既然是protected修饰的 ,为什么还要对他进行 封装字段是他变为属性哪? 我试了一下,如果写成:“protected string Name{get;set;}”这样是不……
[/Quote]
属性 get 和 set 某一个字段,才能称为对该字段的封装,protected string Name{ get; set; } 这种是独立属性
dabing69221 2012-06-24
  • 打赏
  • 举报
回复
不是我不懂为什么 我书上写了一个 用protected修饰的字段 然后 有把这个字段封装成属性;
如: protected string Name{get;set;}
我知道这是用了一个自动属性,但是我不懂,父类中的属性既然是protected修饰的 ,为什么还要对他进行 封装字段是他变为属性哪? 我试了一下,如果写成:“protected string Name{get;set;}”这样是不是失去了protected的作用啊?
__天涯寻梦 2012-06-23
  • 打赏
  • 举报
回复
字段 a 直接访问被认为不安全,所以采用 A 属性来间接的访问 a ,这种加中间层的方式,就是封装
dabing69221 2012-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

BaseTest basetest = new BaseTest();
换成
ChildTest basetest = new ChildTest();
就不报错,子类中实例化父类编译器认为是在类外部访问
[/Quote]

我有个问题想问问你啊?如果我声明了一个protected修饰的属性然后在对它进行封装是什么意思啊?
就好比这样啊:
private int a;

protected int A
{
get { return a; }
set { a = value; }
}
__天涯寻梦 2012-06-23
  • 打赏
  • 举报
回复
BaseTest basetest = new BaseTest();
换成
ChildTest basetest = new ChildTest();
就不报错,子类中实例化父类编译器认为是在类外部访问
dabing69221 2012-06-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

好象在你的子类的构造函数这里,应该加上父类的构造引用,
public void printTest() : base()
{
BaseTest basetest = new BaseTest();
this.a = basetest.a;
//当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
thi……
[/Quote]

这不是构造函数啊!
dabing69221 2012-06-23
  • 打赏
  • 举报
回复
问你一下用protected修饰过的属性需要进行封装吗?
fsstolw 2012-06-23
  • 打赏
  • 举报
回复
好象在你的子类的构造函数这里,应该加上父类的构造引用,
public void printTest() : base()
{
BaseTest basetest = new BaseTest();
this.a = basetest.a;
//当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
this.c = basetest.b;
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧