一直没搞清楚protected访问修饰符的意思,不是说能在派生类中被访问到的吗,这里所说的能被派生类访问到到低是个什么意思啊,搞不懂了。public class father
{
protected string name="name1";
}
public class son:father
{
public void method()
{
father obj=new father();
string name2=obj.name;//这里为什么obj访问不到name
name2=base.name;//这个可以访问到
}
}
{
protected string name="name1";
}
public class son:father
{
public void method()
{
father obj=new father();
string name2=obj.name;//这里为什么obj访问不到name
name2=base.name;//这个可以访问到
}
}
解决方案 »
- 被Thread弄得快疯了,如何安全终止线程?
- 有没有只选择年月的控件呀,日期挑选器是含日的,我只想选择到某年某月,用什么控件?
- Winform转Webform容易不?
- tcpclient 多线程问题
- C# 有没有办法控制MouseHover上的时间问题?
- 如何设置win程序里的toolbar控件的背景图片
- winform中,listview控件的SelectedIndexChanged(object sender, System.EventArgs e)事件中怎么取当前选择项的index与其它信息
- C#连接oracle报java.lang.UnsatisfiedLinkError 异常我跟踪是在打开数据库连接时报的,我用的是Client.OracleConnection
- 我想用一年甚至更多年的数据绘图,横坐标是年月日,怎么画横坐标请给个思路?
- 关于引用的问题
- 关于C,C++,C#
- C/S模式C#程序和B/S模式C#程序程序如何相互传值
你这个要好好看看书。public class father
{
protected string name="name1";
}
public class son:father
{
public void method()
{
father obj=new father();
string name2=obj.name;//这里就相当于外部访问,跟继承没有关系
name2=base.name;//这里就是访问父类,直接使用name2=name也可以访问。
}
}
{
father obj=new father();
string name2=obj.name;//这里为什么obj访问不到name
name2=base.name;//这个可以访问到
}
你要看this 和你调用的对象之间的关系 而不是看你把代码放在哪个位置
this和base的关系 是派生类
this和obj是没关系的2个实例
那我这样public void method()
{
father obj=new father();
string name2=obj.name;//这里为什么obj访问不到name
name2=base.name;//这个可以访问到
son obj2=new son();
name2=obj2.name;
}
这里的obj2跟this又有什么关系呢,不是也没关系吗??
然后用实例去访问那就是外部访问,不是你写在它子类里,就不是外部访问了。
protected 说派生类可以访问,也就是派生类中可见。实例是不可以见的
大哥!关键这个obj2可以访问到啊,不信你试试???
2:
public class father
{
protected string name="name1";
}
public class son:father
{
public void method()
{
father obj=new father();//你这里创建了一个父类的实例,而父类中name成员是保护类型的,所以
string name2=obj.name;//在这里你永远不可能访问到name
name2=base.name;//这个可以访问到是因为你直接访问其父类的保护成员,这在C#语法中是正确的。
}
}
//你应该多看看C#的继承和成员访问控制,冒昧的说一句,你书没看好,OO基本知识十分不扎实。
很高兴接受你的批评,我想说我书还是看了比较多的,只是书上都是说protected可以在派生类中访问到,而我对这句话只是没能很好的理解进去
那base为什么能访问到,base应该也是一个实体对象(在创建派生类实例时先创建基类实例)
你这个method()方法是在son里声明的,
所以obj2应该跟this有点关系吧
name2=obj2.name;
因为是在son里声明son对象,所以跟this有关系,如果声明的不是son对象,而是别的对象,比如father或别的,那就没关系了
name2=obj2.name;实际上访问到的是son自己的属性,只是这个值从father继承而来
public class father
{
protected string name="name1";
}
public class son:father
{
public void method()
{
father obj=new father();
string name2=obj.name;//这里为什么obj访问不到name
name2=base.name;//这个可以访问到
son obj2=new son();
name2=obj2.name;
}
}还是要搞清定义
先复习一下关键字protected 的定义:受保护成员在它的类中可访问并且可由派生类访问。
仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的。
因为obj2.name是通过派生类来访问的,所以能访问到。
其实private私有型变量也是这样,如果在Father类中有一个
private string s="";
Father father = new Father();
这时father.s也是访问不到的
Son继承了name属性没错,但是Son的实例对象是访问不到自己本身的受保护属性的。
由于Son是Father的派生类,所以按照上面复习的定义是能访问到的Father中的受保护成员。而Father father = new Father();
这个father 是访问不到自己的受保护对象的,就像是访问不到自己的私有变量一样
因为father 不是Father的派生类
不过受保护成员在它的类中可访问
而不能用实例出来的father 对象来访问
OVER 可以结贴了
兄台那请问base.name这样的访问是通过什么来访问的?
原来声明成protected的成员必须在其所在的类的内部访问,
如果在其类的外部访问的话,必须是其子类的内部。在子类的内部有几种访问形式:假设B是声明了保护实例成员M的基类,并假设D继承自B。那么在D的类主体内部,可以通过下列形式之一来访问M:一个M形式的非限定类型名或者基础表达式。
一个E.M形式的基础表达式,这里E的类型是T或者T的子类,而T是类类型D,或者从D构造出来的类类型。
一个base.M形式的基础表达式。
在本类的内部声明一个本类类型的实例或本类子类的实例,这个实例还可以访问private成员。
public class father
{
protected string name="name1";
private int age=23;
public void fatherMethod()
{
son s=new son();
string str= s.name;//可以访问
int a= s.age;//可以访问
}
}
public class son:father
{
public void method()
{
father obj=new father();
string name2=obj.name;//这里访问不到是因为已经在name定义的类外面了。
name2=base.name;//这个可以访问到
son obj2=new son();
name2=obj2.name;
}
}也就是在本类之外通过实例.形式不能访问public 之外的成员。除非这个实例是本类类型,也就是说是本类的实例或本类子类的实例。
可参考:http://book.51cto.com/art/200911/160234.htm
首先这行代码是在Son类的method() 方法里的,
那么这里的base的所属是son,也就是son的base,也就是this.base,
而通过son的base来访问Father类中的name属性,就==通过son(Father的派生类)来访问Father这个基类中的受保护成员name,由Protected的定义可见,这样是可以访问的。name2=base.name;
其实这行代码是把this给省略了
写全了就好理解了,还是通过son这个派生类来访问的Father中的受保护成员name
name2=this.base.name;//这样写全了一样
好像不能这样写,反正可以这样理解,特此纠正,以防误人子弟
name2=base.name;//就相当于通过派生类来访问基类的受保护成员,所以是可以访问的到的。
public class father
{
protected string name = "name1";
}
public class son : father
{
public void method()
{ Console.WriteLine(name);
}
}
class Program
{
static void Main(string[] args)
{
son s = new son();
s.method();
}
}