• 四、继承(上)


         继承是面向对象编程中一个非常重要的特性,它也是另一个重要特性——多态的基础。

    4.1 继承概念的引入

         现实生活中的事物都归属于一定的类别。比如,狮子是一种动物。为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)的特性。

         构成继承关系的两个类中,动物称为父类(parent class)或基类(base class),狮子称为子类(child class)。

         提示:

         在一些书中,将父类称为超类(super class)。

         “继承”关系有时又称为“派生”关系,“B继承自A”,可以说为“B派生自A”,或反过来说,“A派生出B”。

         父类与子类之间拥有以下两个基本特性:

         ① 是一种(IS_A)关系:子类是父类的一种特例。

         ② 扩充(Extends)关系:子类拥有父类所没有的功能。

         以下C#代码实现了狮子类与动物类之间的继承关系:

    class Animal

    {

    }

    class Lion:Animal

    {

    }

         可以看到,C#中用一个冒号间隔开父类和子类。

    4.2 类成员的访问权限 

         面向对象编程的一大特点就是可以控制类成员的可访问性。当前主流的面向对象语言都拥有以下三种基本的可访问性:

    可访问性 C#关键字 含义
    公有 public 访问不受限制
    私有 private 只有类自身成员可以访问
    保护 protected 子类可以访问,其它类无法访问

    (1)public和private

         public和private主要用于定义单个类的成员存取权限。

         请看以下示例代码:

    public class A

    {

         public int publicI;

         private int privateI;

         protected int protectedI;

    }

         当外界创建一个A的对象后,只能访问A的公有实例字段publicI:

    A a=new A();

    a.publicI=100;  //OK!

         类A的私有实例字段privateI只能被自身的实例方法所使用:

    public class A

    {

         public int publicI;

         private int privateI;

         protected int protectedI;

         private void f()

         {

              privateI=100;  //OK!

         }

    }

         上述代码中,类A的私有方法f()访问了私有字段privateI。注意,只要是类A直接定义的实例方法,不管它是公有还是私有的,都可以访问类自身的私有实例字段。

    (2)protected

         在形成继承关系的两个类之间,可以定义一种扩充权限——protected。

         当一个类成员被定义为protected之后,所有外界类都不可以访问它,但其子类可以访问。

         以下代码详细说明了子类可以访问父类的哪些部分:

    class Parent

    {

         public int publicField=0;

         private int privateFiled=0;

         protected int protectedField=0;

         protected void protectedFunc()

         {}

    }

    class Son:Parent

    {

         public void ChildFunc()

         {

              publicField=100;  //正确!子类能访问父类的公有字段

              privateFiled=200;  //错误!子类不能访问父类的私有字段

              protectedField=300;  //正确!子类能访问父类的保护字段

              protectedFunc();  //正确!子类能访问父类的保护字段

         }

    }

         当创建子类对象后,外界可以访问子类的公有成员和父类的公有成员,如下所示:

    Son obj=new Son();

    //可以调用子类的公有方法

    obj.ChildFunc();

    //可以访问父类的公有字段

    obj.publicField=1000;

         由此可见,可以通过子类对象访问其父类的所有公有成员,事实上,外界根本分不清楚对象的哪些公有成员来自父类,哪些公有成员来自子类自身。

         小结一下继承条件下的类成员访问权限:

         ① 所有不必让外人知道的东西都是私有的。

         ② 所有需要向外提供的服务都是公有的。

         ③ 所有的“祖传绝招”,“秘不外传”的都是保护的。

    (3)internal

         C#中还有一种可访问性,就是由关键字internal所决定的“内部”访问性。

         internal有点像public,外界类也可以直接访问声明为internal的类或类的成员,但这只局限于同一个程序集内部。

         读者可以简单地将程序集理解为一个独立的DLL或EXE文件。一个DLL或EXE文件中可以有多个类,如果某个类可被同一程序集中的类访问,但其他程序集中的类不能访问它,则称此类具有internal访问性。

         例如类库项目ClassLibrary1可以生成一个独立的程序集(假定项目编译后生成ClassLibrary1.DLL),其中定义了两个类A和B:

    namespace ClassLibrary1

    {

         internal class A

         {

              internal int InternalI=0;

         }

         public class B

         {

              public void f()

              {

                   A a=new A();   //OK!

                   a.InternalI=100;   //OK!

              }

         }

    }

         由于类B和类A属于同一个程序集,所以,B中的代码可以创建A的对象,并访问A的声明为internal的成员InternalI。

         在程序集ClassLibrary1.DLL之外,外界只能创建声明为public的类B的对象,不能创建声明为internal的类A的对象。

         internal是C#的默认可访问性,这就是说,如果某个类没有任何可访问性关键字在它前面,则它就是internal的。

         比如上面的类A也可以写成:

    class A

    {

         internal int InternalI=0;

    }

         它完全等同于

    internal class A

    {

         internal int InternalI=0;

    }

         但要注意,在类中,如果省略成员的可访问性关键字,则默认为private的。

         例如:

    class A

    {

         int InternalI=0;

    }

         相当于

    internal class A

    {

         private int InternalI=0;

    }

    使用场合 C#2.0 Visual Basic 2005 说明
    Type(指类,接口等类型) public Public 访问不受限制
      internal Friend 访问范围仅限于同一程序集
    Member(指类型中的成员,比如类中的字段) public Public 访问不受限制
      internal Friend 访问范围仅限于同一程序集
      protected protected 访问范围仅限于自己或派生出来的子类型
      protected internal Protected Friend 在同一程序集内访问不受限制,在不同程序集中仅由此类型派生出来的子类型可访问
      private Private 仅自己可以访问
  • 相关阅读:
    英语Lignaloes沉香木LIGNALOES单词
    英语chrismatite黄蜡石chrismatite单词
    英语cartialgenous鹿茸cartialgenous单词
    英语NanyangJade南阳玉NanyangJade独山玉
    单词chalchiguite硬玉chalchiguite英语
    英语_金丝楠是紫楠(phoebeSheareri)的别名
    英语AquilariaCrassna奇楠沉香
    英语LIGNALOO沉香lignaloo单词
    iOS批量添加SDK自动打包GUI工具
    如何做一个跨平台的游戏App?
  • 原文地址:https://www.cnblogs.com/mxx0426/p/4299014.html
Copyright © 2020-2023  润新知