您好,欢迎访问三七文档
第七章类和继承本章内容类继承访问继承的成员隐藏基类成员基类访问使用基类的引用构造函数的执行程序集之间的继承成员访问修饰符抽象成员抽象类密封类静态类扩展方法外部方法7.1继承类通过集成我们可以定义一个新类,新类纳入已声明的类并进行扩展。可以使用一个已经存在的类作为新类的基础。已存在的类叫做基类,新类称为派生类。派生类的成员组成包括自己声明的成员和基类的成员。要声明一个派生类,需要在类名后加入基类规格说明。基类规格说明由冒号和后面跟着用作基类的类名称组成。派生类被描述为扩展它的基类,因为它包含基类成员,加上在它自己声明中的任何附加功能。派生类不能删除它所继承的任何成员。例子:classotherclass:someclass7.2访问继承的成员继承的成员可以被访问,就像他们是派生类自己声明的一样。Classsomeclass{…}Classotherclass:someclass{…}Classprogram{Staticvoidmain(){Otherclassoc=newotherclass();Oc.method1(oc.field1);Oc.method1(oc.field2);Oc.method2(oc.field1);Oc.method2(oc.field2);}}7.3隐藏基类的成员虽然派生类不能删除他继承的任何成员,但它可以隐藏他们。要隐藏一个继承的数据的成员,需要声明一个新的相同类型的成员,并使用相同的名称。通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖集成的函数成员,签名由名称和参数列表组成,但是不包括返回类型。要让编译器知道你在故意隐藏继承成员,使用new修饰符。没有它,程序可以成功编译但是编译器会告诉你隐藏了一个继承成员也可以隐藏静态成员7.4基类访问有时候,派生类需要访问被隐藏的继承成员。可以使用基类访问表达式来访问隐藏的基类成员。基类访问表达式是由关键字base后面跟着一个点和成员的名称组成,如下所示:Console.WriteLine(“{0},base.Field1”);说明:Field1是被派生类隐藏了。7.5使用基类的引用如果有一个派生类对象的引用,就能够获取该对象基类部分引用。下面着重接收一下使用对象的基类部分的引用访问对象。7.5.1虚方法和复写方法虚方法可以使基类的引用访问“升至”派生类内。使用基类调用派生类的的方法,只需要满足下面的条件:派生类的方法和基类的方法具有相同的签名和返回类型。基类的方法使用virtual标注派生类的方法是用override标注。其它关于virtual和override修饰符的重要信息如下复写和被复写的方法必须有相同的可访问性。不能复写static方法和非虚方法方法属性和索引,以及称为事件的另一种成员类型,他们都可以被声明为virtual和override7.5.2复写标记为override的方法复写方法可以在继承的任何层次出现。当使用对象基类部分的引用调用一个复写的方法时,方法的调用被沿派生层上溯执行,一直到标记为override地方法的最派生版本。如果在更高的派生级别有该方法的其他声明,但没有被标记为override,那么它们不会被调用。情况1:使用override声明Print情况2:使用new声明Print7.6构造函数的执行派生类对象有一部分就是基类对象。要创建对象的基类部分,基类的一个构造函数被作为创建实例过程的一部分被调用。继承层次链中的每一个类在执行它自己的构造函数之前执行它的基类的构造函数。当一个实例被创建的时候,完成第一件事情就是初始化对象的所有实例成员。在此之后,基类的构造函数被调用,然后该类自己的构造函数才能被执行。对象构造的顺序初始化实例成员调用基类构造函数执行实力构造函数的方法体例子:ClassmyDerivedclass:mybaseclass{Intmyfield2,myfield1=5;//1.成员初始化PublicmymyDerivedclass()//3.构造函数体执行{…}}Classmybaseclass{Publicmybaseclass()//2.基类构造函数调用{…}}7.6.1构造函数的初始化语句默认情况下在对象构造函数时,基类无参基类函数被调用。但是构造函数可以重载,所以基类可能有一个以上的构造函数。如果希望派生类使用一个指定的积累构造函数而不是无参数构造函数,必须在构造函数初始化语句中指定。第一种形式使用关键字base并指明使用哪一个基类构造函数。第二种形式使用关键字this并指明应该使用当前类的哪一个另外的构造函数。7.6.2类访问修饰符类可以被系统中其他类看到并访问,雷德克访问性有两个级别:public和internal。标记为public的泪可以被系统内任何程序集中的代码访问。标记为internal的类只能被他自己所在的程序集内的类看到。这是默认的可访问级别,可以使用这个修饰符显示的声明这个类为内部的。7.7程序集间的继承C#允许从一个不同的程序集内定义的基类派生类,但是必须满足:基类必须声明为public,这样它才能被从它所在的程序集外部访问。必须在VisualStudio工程中包括对包含该基类的程序集引用7.8成员访问修饰符对类的可访问性只有两种修饰符,但是成员的访问级别有五个:公有的,public:对程序及外部的类也可见。私有的,private:默认的访问级别。受保护的,protected:内部的,internal:受保护内部的,protectedinternal:7.8.1访问成员的区域不继承myclass的类继承myclass的类所有其他程序集相同程序集Publicclassmyclass5Members1234类myclass被声明为public,它的成员的可见性依赖于各个成员个体的访问修饰符说明:在同一程序集并继承它(右下)在同一程序集但不继承它(左下)在不同程序集并继承他(右上)在不同程序集但不继承他(左上)7.8.2公有成员的可访问性不继承myclass的类继承myclass的类所有其他程序集相同程序集Publicclassmyclass5Members1234类myclass被声明为public,它的成员的可见性依赖于各个成员个体的访问修饰符Public访问级别是限制性最少的,所有的类,包括程序集内部的类和外部的类都可以自由的访问成员声明一个公有成员:Publicintmember1可见区域为1,2,3,4,57.8.3私有成员的可访问性不继承myclass的类继承myclass的类所有其他程序集相同程序集Publicclassmyclass5Members1234类myclass被声明为public,它的成员的可见性依赖于各个成员个体的访问修饰符私有成员是限制最严格的。Private类成员只能被他自己的类成员访问。他不能被其他的类访问,包括继承他的类。Private类成员能被嵌套他的类中的类成员访问。可见区域:5。7.8.4受保护成员的可访问性不继承myclass的类继承myclass的类所有其他程序集相同程序集Publicclassmyclass5Members1234类myclass被声明为public,它的成员的可见性依赖于各个成员个体的访问修饰符受保护乘员的访问级别类似于私有成员,但是,它允许派生自该类的类访问该成员。访问区域:2,4,5.7.8.5内部成员的可访问性不继承myclass的类继承myclass的类所有其他程序集相同程序集Publicclassmyclass5Members1234类myclass被声明为public,它的成员的可见性依赖于各个成员个体的访问修饰符对所有程序集内部课件,但是对程序集外部的类不可见。可见区域:3,4,5。7.8.6受保护内部成员的可访问性不继承myclass的类继承myclass的类所有其他程序集相同程序集Publicclassmyclass5Members1234类myclass被声明为public,它的成员的可见性依赖于各个成员个体的访问修饰符对所有继承该类的类核对所有程序集内部可见,注意,这是protected和internal的联合,不是交集。可见区域:2,3,4,5.7.9抽象成员抽象成员是被设计来被覆写的函数成员。抽象成员有以下特征:被abstract修饰符标记。没有实现代码块,代码快被分号代替。如:abstractpublicvoidprintstuff(strings);Abstractpublicinternalmyproperty{Get;Set;}7.10抽象类抽象类只能被用作其他类的基类,它就是设计用来被继承的。不能创建抽象类的实例。抽象类使用abstract修饰符声明。抽象类可以包含抽象成员但不是必须的。抽象类可以自己派生另一个抽象类。任何派生的抽象类必须使用override关键字实现该类所有抽象成员,除非派生类自己也是抽象类。Abstractclassabclass{//抽象类Publicvoididentifybase(){console.Writeine(“Iamabclass”);}//普通方法Abstractpublicvoididentifyderived();}//抽象方法Classderived:abclass{//派生类Overridepublicvoidindentifyderived()//抽象方法的实现{console.writeline(“Iamderivedclass”);}}Classexample{Staticvoidmain(){//abclassa=newabclass();//错误,抽象类不能被实例化//a.identifyderived();deriedclassb=newderiedclass();//实例化派生类b.identifybase;//调用继承的方法b.identifyderived();//调用“抽象”方法7.11密封类密封类作为独立的类不能用作基类。使用sealed修饰符修饰。例子:Sealedclassmyclass{…}7.12静态类静态类是一种类,在那里所有成员都是静态的,静态类用于分组不受实例数据影响的数据和函数。静态类的一个普通的用途就是创建一个包含一组数学方法的数学库。类本省标记为static。类所有成员必须是静态的。类可以有一个静态构造函数,但没有实例构造函数,不能创建该类的实例。不能继承静态类他们是密封的。7.13扩展方法扩展方法的需求如下:扩展方法必须被声明为static。扩展方法声明所在的类也必须被声明为static。扩展方法必须包含关键字this作为他的第一个参数类型,并在后面跟着他所扩展的类型名称。7.14外部方法外部方法是在声明中没有实现的方法。外部方法使用extern修饰符标记,而且在类的声明中没有实现,它的实现被分号取代。声明和实现的连接是依赖实现的。
本文标题:C#第七章
链接地址:https://www.777doc.com/doc-3383227 .html