Luyan

追求,探索,研究,创新...
随笔 - 58, 评论 - 663, 引用 - 54

导航

关于


标签

每月存档

最新留言

广告

 

有这样一个类:
class T
{
 protected string aaa;
public T(string val)
{
 aaa = val;
}
 public string GetString(T t)
 {
  return t.aaa;
 }
}

和以下两种用法:
1):
   T t1 = new T("test");
   Console.WriteLine(t1.GetString(t1));
2):
   T t1 = new T("test1");
   T t2 = new T("test2");
   Console.WriteLine(t1.GetString(t2));

请选择答案并说明理由:
a) 编译不通过
b)第一种用法不能通过
c)第二种用法不能通过
d)都能通过

附注:首先最好别先编译测试结果,只凭感觉做答案

打印 | 张贴于 2004-06-23 11:01:00 | Tag:暂无标签

留言反馈

#re: 关于protected的Quiz 编辑
明显是都能通过。
2005-08-22 06:59:00 | [匿名:mooniscrazy]
#re: 关于protected的Quiz 编辑
我觉得都能过,代码访问的是GetString公共方法,自然没有任何限制,受保护的aaa是GetString去访问的,而GetString访问aaa也没有问题.所谓的保护指的是直接发生访问关系.
想起中介,中介机构为了保护自己的利益,不允许交易双方直接约见,但双方可以通过中介来对话,呵呵....
对于GetString访问另一个类型的protect成员,因为protect限制的不是实例间的访问,而是类,只要访问者与被访问者的类型,符合相同或访问类型继承自被访问类型即可.
2004-12-13 09:09:00 | [匿名:大坏蛋]
#回复: 关于protected的Quiz 编辑
learning....
2004-06-25 14:24:00 | [匿名:阿赖]
#回复: 关于protected的Quiz 编辑
我觉得这个要看具体的编译器的实现了。C++和DELPHI都可以这样访问的。不知道C#是如何处理的。如果我选,我选择D。

等下写个看看
2004-06-25 13:08:00 | [匿名:疯铃]
#回复: 关于protected的Quiz 编辑
JGTM'2004 [MVP] 一句话点醒梦中人!
2004-06-25 12:48:00 | [匿名:DSharp]
#回复: 关于protected的Quiz 编辑
@Lostinet:

要想访问Control内部的protected成员Context,你的MyControl必须是Control的派生类才行啊。很奇怪,既然要写自己的Control,为什么不从Control派生呢?:)

@minbear:

是啊,有日子没动笔啦!一来是工作繁忙,抽不出整块的时间写点儿东西;二来也没有想好写些什么。还好还有些存货,我整理一下尽早与大家分享吧!:)
2004-06-24 15:16:00 | [匿名:JGTM'2004 [MVP]]
#回复: 关于protected的Quiz 编辑
JGTM大哥解释得不错,不过好像好久没见了~
2004-06-23 22:47:00 | [匿名:minbear]
#回复: 关于protected的Quiz 编辑
我说的想取Control的Context是这样写的:

public class MyControl
{
public HttpContext GetContext(Control that)
{
return that.Context;
}
}

..
2004-06-23 20:25:00 | [匿名:Lostinet]
#回复: 关于protected的Quiz 编辑
我一开始就以经验来否定这个问题的确是很不妥.
其实在例如 Equals 这样的方法中,直接访问另外一个对象的同一个类的成员是很经常的.
2004-06-23 20:21:00 | [匿名:Lostinet]
#回复: 关于protected的Quiz 编辑
@DSharp:

这跟内联、IL都没什么关系,原理上讲,private/protected/internal等等成员访问级别的概念都是在编译器一级实现的语言逻辑(或称功能),在运行期是没有什么显式的机制来保障的(比如说透过Reflection一样可以访问对象内部的private/protected的成员一样)。
2004-06-23 19:41:00 | [匿名:JGTM'2004 [MVP]]
#回复: 关于protected的Quiz 编辑
sumtec是正确的,答案显然是d:因为private/protected/public 都是针对“类型”(的成员)所施加的访问级别控制,跟特定的“实例”无关。

另外,Lostinet所称不能取得Control类的Context的问题,是因为需要取得Context的那个类型并不是Control或其派生类,自然对于Control类型内部的成员而言是external的了,因而其Context对你就理所应当是protected了,那你当然就访问不到了。

这是个考面向对象基本概念的好问题。:)
2004-06-23 19:37:00 | [匿名:JGTM'2004 [MVP]]
#回复: 关于protected的Quiz 编辑
明显是都能够通过,选d

在这个例子里面,甚至把protected改成private都一样能够通过。在T的内部处理T类型的东西,无论是this还是“that”,都可以毫无保留的访问到。

因为这是基于这么一个假设的:设计T这个类型的人,如果想要处理另外一个也是T类型的对象,一定知道自己正在干什么。因此怎么处理类型为T的这个对象就应该是设计这个类型T的作者的自由。

这个例子可以引申到另外一个例子:如果我从T派生出X,那会怎么样?如果T派生X但是aaa是private的,那又会怎么样?

前者无论如何都可以通过,后者则无法通过。
2004-06-23 19:14:00 | [匿名:sumtec]
#回复: 关于protected的Quiz 编辑
C:
Agree with tanzhaoqing
2004-06-23 14:52:00 | [匿名:Zhiyong]
#回复: 关于protected的Quiz 编辑
D
2004-06-23 13:36:00 | [匿名:heihei]
#回复: 关于protected的Quiz 编辑
我也认为两者都能通过。理由和DSharp差不多。

这里还想问问这样一个问题。不知道各位怎么看的。

-- 我这里保留了来自某位网友的这样一个提问,就是问这样做合理不合理。
-- 网友的名字应该是Shun,可惜我忘记是在哪里看到的了。:<对不起。

这个自动类型转换应不应该?
using System;
namespace ConsoleApplication3
{
class Base
{
private int m=2;
public int GetM(Parent p){return p.m;}//查看返回的m是父类还是基类的
}
class Parent:Base
{
private int m=3;
}
class test
{
public static void Main()
{
Base b=new Base();
Parent p=new Parent();
int r=b.GetM(p); //事实证明返回的是基类的m
}
}
}
我感觉这里编译器处理的不好,不应该自动进行类型转换,应该报错无权访问。
如果自动转换,很容易造成混乱。

---引用结束

我也觉得这样的做法很有问题。不合理。可是当时刘敏和袁伟都说合理。

关键在于这句
public int GetM(Parent p){return p.m;}//查看返回的m是父类还是基类

如果带入的是Base的话,我可以理解,但是带入的是Parent的。这个时候因为在Base内,自动的把Parent替换为Base,从而可以自由的对Base的私有成员访问。
2004-06-23 13:08:00 | [匿名:Yu]
#回复: 关于protected的Quiz 编辑
见上面连接,两个都是可以通过的,private方法也可以,包括从Object继承的保护及私有方法,我认为当一个类使用自身的参数时,可能是作为内联类来实现的,现在对IL代码不是很了解,等学习以后倒是可以看看生成的IL代码是什么样的。
2004-06-23 12:33:00 | [匿名:DSharp]
#回复: 关于protected的Quiz 编辑
C#我不知道,但是类似的代码在C++下肯定是可以的

两种方法都可以
2004-06-23 11:39:00 | [匿名:豆腐]
#回复: 关于protected的Quiz 编辑
d
2004-06-23 11:38:00 | [匿名:刘敏(Rustle Liu)]
#回复: 关于protected的Quiz 编辑
我用C++作过类似的事情

都可以通过,而且运行结果也应该没问题

protected string aaa
aaa虽然是protected的但是在类成员函数是可以使用它的

Console.WriteLine(t1.(t2));
这条语句应该输出:test2

成员函数只和类有关,对于同一个类的不同实例函数都是一样的
2004-06-23 11:36:00 | [匿名:yaodong]
#回复: 关于protected的Quiz 编辑
赞成Lostinet的说法。
2004-06-23 11:31:00 | [匿名:minbear]
#回复: 关于protected的Quiz 编辑
两个都不能通过的。
不能通过的是在
public string GetString(T t)
{
return t.aaa;
}
而不是传什么进去。

我就尝试过用类似的方法想取某个Control的Context,结果不允许这样访问。
2004-06-23 11:24:00 | [匿名:Lostinet]
#回复: 关于protected的Quiz 编辑
第一种能通过
第二种不能通过
protected string aaa;是受保护的,return t.aaa只接受自身类或者继承类调用
2004-06-23 11:24:00 | [匿名:tanzhaoqing]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0