什么是继承:在我理解继承就是儿子和爸爸的关系,爸爸将自己做能提供的都提供给儿子,而儿子必然在父亲的基础上进行延续;
例:
{
}
class son:father
{
}
说到这里可能就要请我们的类继承权限的问题了;
也就是说使用public的时候所有外界的人员都可以访问你,这么说的话你们家可就慷慨了。嘿嘿,有付出才有回报么。
● public:所有外界类均可访问此成员;
当然有时候父亲的东西连自己都觉得是隐私,嘿嘿,比如你老爸当年是怎么追上你老妈的,父亲肯定连自己的儿子都不愿意告诉。那么就出现下面这个访问权限了private。
● private:所有外界类均不可访问此成员。
呵呵既然是儿子,父亲应该也给点机会使用特权吧,那么就出现了和上面那个几乎相反的访问权限,可以访问父亲但是外家族的人是坚决不能访问的。
● protected:所有外界类都不可以访问此成员,但子类可以访问。
说这么多还是不理解的话,可以看下金老师的例子,如下:
{
public int publicField=0;
private int privateFiled=0;
protected int protectedField=0;
protected void protectedFunc()
{ }
}
class Son:Father
{
public void ChildFunc()
{
publicField = 100; //正确!子类能访问父类的公有字段
privateFiled = 200; //错误!子类不能访问父类的私有字段
protectedField = 300; //正确!子类能访问父类的保护字段
protectedFunc(); //正确!子类能访问父类的保护方法
}
}
小结一下继承条件下的类成员访问权限。
q 所有不必让外人知道的东西都是私有(private)的。
q 所有需要向外提供的服务都是公有(public)的。
q 所有的“祖传绝招”、“秘不外传”的都是保护(protected)的。
另外C#中还有两个访问权限,internal和protected internal 这个两个和继承的关系就不怎么大了。internal:所表示的就是只有本程序集可以访问;
protected internal :顾名思义就是受保护的 internal 那也是外界不可访问的,只有当你所要描述的类是这个成员所在类的子类的时候才可以访问此类。
类型访问权限一览表
使用场合 |
C# 2.0 |
Visual Basic 2005 |
说 明 |
Type (指类、接口等类型) |
public |
Public |
访问不受限制 |
internal |
Friend |
访问范围仅限于同一程序集 |
|
Member (指类型中的成员,比如类中的字段) |
public |
Public |
访问不受限制 |
internal |
Friend |
访问范围仅限于同一程序集 |
|
protected |
protected |
访问范围限于自己或派生出来的子类型 |
|
protected internal |
Protected Friend |
在同一程序集内访问不受限制,在不同程序集中仅由此类型派生出来的子类型可访问 |
|
private |
Private |
仅自己可以访问 |
类型转换
构成继承关系的父类和子类对象之间有一个重要的特子类对象可以被当成父类对象使用。
这是因为子类对象本来就是一种(IS_A)父类对象,因此以下代码是合法的
father m_father;
son m_son=new son();
m_father=m_son;
因为子类对象是可以传递给父类对象的。
然而反过来就不可以了。
如果确定父类型变量中所引用的对象的确是子类系统,则可以通过类型的强制转换进行赋值
语法格式如下:
子类对象变量=(子类型名称)基类对象名称
或则使用as运算符
子类对象变量=基类对象变量as子类名称
C#中使用括号进行强制类型转换时,生成的IL指令为castclass;使用as运算符进行类型转换,生成的IL指令为isinst。
如果使用第一种类型转换方式(即使用括号方式),在程序运行时,CLR会检查类型转换操作以确保总是将对象转换为它的实际类型(或者是它的任何基类型),当CLR发现某类型操作违反了此规则时,将会抛出一个异常,如果程序没有代码处理这一异常,CLR将终止应用程序进程。因此,我们不能用类型强制转换机制对变量类型进行乱转换。比如,假设Daughter是Parent的另一个子类,以下代码可以通过编译,但在运行时会出现一个InvalidCastException异常
当然利用as的时候不可能出现这个异常。。。如果错误的话,会返回一个NULL值给变量。当然我们也可以用is进行判断例如:
father m_father=new fathre();
son m_son;
m_son=m_father as son;
//下面我们就可以进行判断是否为空了
if(son!=null)
{........}
father m_father=new father();
son m_son;
if (m_father is son)
{
m_son=(son)m_father;
}