对于子类不能直接访问父类 我的理解是 可以用这样的方法将我们的成员保护得更好,让子类的设计者只能通过父类指定的方法修改父类的私有成员,这样将能把类保护得更好你可以看下面的例子BaseClasspublic class BaseClass { private List<string> list = new List<string>(); public void Add(string s) { list.Add(s); } public void ConsoleOut() { foreach(string s in list) { Console.WriteLine(s); } } }ChildClasspublic class ChildClass : BaseClass {
}TestChildClass cc = new ChildClass(); cc.Add("1"); cc.Add("2"); cc.Add("3"); cc.ConsoleOut();也就是说你如果想改变List的值 那么只能通过BaseClass的公开的方法Add来访问 当然了,你也可以使用反射~~~~
public class BaseClass { private string s = "sss"; }public class ChildClass : BaseClass {} FieldInfo fi = typeof(ChildClass).BaseType.GetField("s", BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.Instance); string s = fi.GetValue(new ChildClass()) as string;请测试~~~
{ private string name;}class child : parent
{
public string getname()
{
return super.name;
//return name; //这样子就不行
}
}
但可以以private的方式继承父类,如:class parent
{ private string name;}class child : private parent
{
...
}
使用protected类和类的派生类可以访问
这主要是为了防止在子类中修改父类中用private指定的成员值
楼主说的是当一个父类的公共方法被继承时为什么能访问父类中的私有属性吗?其实是这样的 继承后其实这个方法并不是子类的 而是父类的,所以它理所当然能访问本类下的成员楼主可能是把继承弄错了class Parent
{
private string _name;
public string GetName()
{
return _name;
}
} class Child : Parent
{
public string ParentName()
{
return GetName();//楼主不要以为这里是自己的GetName方法 其实是隐式调用了 base.GetName();
}
}
这个是什么? java的,类似c#中的base.name
而且整个就是错的.....俺还是太菜了
protected可以被子类继承!
我的理解是
可以用这样的方法将我们的成员保护得更好,让子类的设计者只能通过父类指定的方法修改父类的私有成员,这样将能把类保护得更好你可以看下面的例子BaseClasspublic class BaseClass
{
private List<string> list = new List<string>(); public void Add(string s)
{
list.Add(s);
} public void ConsoleOut()
{
foreach(string s in list)
{
Console.WriteLine(s);
}
}
}ChildClasspublic class ChildClass : BaseClass
{
}TestChildClass cc = new ChildClass();
cc.Add("1");
cc.Add("2");
cc.Add("3");
cc.ConsoleOut();也就是说你如果想改变List的值
那么只能通过BaseClass的公开的方法Add来访问
当然了,你也可以使用反射~~~~
public class BaseClass
{
private string s = "sss";
}public class ChildClass : BaseClass
{}
FieldInfo fi = typeof(ChildClass).BaseType.GetField("s", BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.Instance);
string s = fi.GetValue(new ChildClass()) as string;请测试~~~
{
徒弟 t1 = new 徒弟(赏识度.十分欣赏);
Console.WriteLine(t1.徒弟的功力);
徒弟 t2 = new 徒弟(赏识度.垃圾);
Console.WriteLine(t2.徒弟的功力); 师傅 s = new 师傅();
Type 偷秘笈的 = s.GetType();
FieldInfo fi = 偷秘笈的.GetField("师傅的功力", BindingFlags.Instance | BindingFlags.NonPublic);
Console.WriteLine(fi.GetValue(s));
} enum 赏识度
{
十分欣赏, 比较欣赏, 一般, 失望, 垃圾
}
class 师傅
{
private double 师傅的功力;
public 师傅()
{
this.师傅的功力 = 100;
}
protected double 传授武功(赏识度 s)
{
switch (s)
{
case 赏识度.十分欣赏:
return 0.9 * this.师傅的功力;
case 赏识度.比较欣赏:
return 0.7 * this.师傅的功力;
case 赏识度.一般:
return 0.5 * this.师傅的功力;
case 赏识度.失望:
return 0.3 * this.师傅的功力;
case 赏识度.垃圾:
return 0.1 * this.师傅的功力;
default:
return 0;
}
}
} class 徒弟 : 师傅
{
public double 徒弟的功力;
public 徒弟(赏识度 s)
{
this.徒弟的功力 = this.传授武功(s);
}
}不管徒弟再怎么努力,师傅都不会把武功全教授给他,除非被人偷了……
比如,现在有很多产品,主要分为两大类,一类是电脑,一类是汽车
我们可以做如下设计:
1,首先设计一个产品的基类:ProBasepublic class ProBase
{
private enum PropertyTypes
{
//公共的东西写在这里面
caption=0,
name=1,
}
private Dictionary<int,string> propCol;//在这里写基类的公共属性
public virtual string Caption
{
get{return GetPropertyValue(PropertyTypes.caption);}
set{SetPropertyValue(PropertyTypes.caption,value);}
}
public virtual string Name
{
get{return GetPropertyValue(PropertyTypes.name);}
set{SetPropertyValue(PropertyTypes.name,value);}
}public string GetPropertyValue(int propType)
{
return propCol.trygetvalue(propType)
}public void SetPropertyValue(int propType,string value)
{
propCol.add(propType,value);
}}然后我们加了一类产品叫电脑,它比基类多一些属性,比如说,显示器名,我们来写出这个类,public class ComputerPro:ProBase
{
private enum PropertyTypes
{
//公共的东西
caption=0,
name=1,
//新加属性
monitor=2,
}
public string Monitor
{
get{return GetPropertyValue(PropertyTypes.monitor);}
set{SetPropertyValue(PropertyTypes.monitor,value);}
}}再加一个类型:汽车,有发动机属性public class CarPro:ProBase
{
private enum PropertyTypes
{
//公共的东西
caption=0,
name=1,
//新加属性
engine=2,
}
public string Monitor
{
get{return GetPropertyValue(PropertyTypes.engine);}
set{SetPropertyValue(PropertyTypes.engine,value);}
}}以上代码可能不是很合适,但其中的意思应该是比较明白了。
在子类中 super.name 可以使用,是因为是super关键字。super关键字:代表的是父类的一个实类。
this关键字:代表的是类本身的实类。如下:
super.name 语法等效如下:
parent p = new p();
p.name;