| using System ; public class MyBase { public static int x = 55 ; public static int y = 22 ; } public class MyDerived : MyBase { new public static int x = 100; // 利用new 隐藏基类的x public static void Main() { // 打印x: Console.WriteLine(x); //访问隐藏基类的 x: Console.WriteLine(MyBase.x); //打印不隐藏的y: Console.WriteLine(y); } }
输出: 100 55 22
如果移除 new 修饰符,程序将继续编译和运行,但您会收到以下警告:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
如果嵌套类型正在隐藏另一种类型,如下例所示,也可以使用 new 修饰符修改此嵌套类型。
四、多级继承
一些面向对象语言允许一个类从多个基类中继承,而另一些面向对象语言只允许从一个类继承,但可以随意从几个接口或纯抽象类中继承。
只有C++支持多级继承,许多程序员对此褒贬不一。多级继承常会引起继承来的类之间的混乱,继承而来的方法往往没有唯一性,所以C#中类的继承只可以是一个,即子类只能派生于一个父类,而有时你必须继承多个类的特性,为了实现多重继承必须使用接口技术,下面是对接口的多重继承进行介绍: using System ; //定义一个描述点的接口 interface IPoint { int x { get ; set ; } int y { get ; set ; } } interface IPoint2 { int y { get ; set ; } } //在point中继承了两个父类接口,并分别使用了两个父类接口的方法 class Point:IPoint,IPoint2 { //定义两个类内部访问的私有成员变量 private int pX ; private int pY ; public Point(int x,int y) { pX=x ; pY=y ; } //定义的属性,IPoint接口方法实现 public int x { get { return pX ; } set { pX =value ; } } //IPoint1接口方法实现 public int y { get { return pY ; } set { pY =value ; } } } class Test { private static void OutPut( IPoint p ) { Console.WriteLine("x={0},y={1}",p.x,p.y) ; } public static void Main( ) { Point p =new Point(15,30) ; Console.Write("The New Point is:") ; OutPut( p ) ; string myName =Console.ReadLine( ) ; Console.Write("my name is {0}", myName) ; } }
五、继承与访问修饰符
访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性。类的继承中有四个访问修饰符: public protected internal private。使用这些访问修饰符可指定下列五个可访问性级别: public protected internal internal protected private。
声明的可访问性 意义 public 访问不受限制。 protected 访问仅限于包含类或从包含类派生的类型。 internal 访问仅限于当前项目。 protected internal 访问仅限于从包含类派生的当前项目或类型。 private 访问仅限于包含类型。
1、继承中关于可访问域的一些问题
基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都由派生类型继承。这甚至包括基类的私有成员。但是,私有成员的可访问域只包括声明该成员的类型的程序文本。在下面的示例中
class A { int x ; static void F(B b) { b.x = 1 ; // 对 } } class B: A { static void F(B b) { b.x = 1 ; // 错误 } }
类 B 继承类 A 的私有成员 x。因为该成员是私有的,所以只能在 A 的"类体"中对它进行访问。因此,对 b.x 的访问在 A.F 方法中取得了成功,在 B.F 方法中却失败了。
2、继承中关于属性的一些问题
和类的成员方法一样,我们也可以定义属性的重载、虚属性、抽象属性以及密封属性的概念。与类和方法一样,属性的修饰也应符合下列规则:
属性的重载
1. 在派生类中使用修饰符的属性,表示对基类中的同名属性进行重载。
2. 在重载的声明中,属性的名称、类型、访问修饰符都应该与基类中被继承的属性一致。
3. 如果基类的属性只有一个属性访问器,重载后的属性也应只有一个。但如果基类的属性同时包含get 和set 属性访问器,重载后的属性可以只有一个,也可以同时有两个属性访问器。
注意:与方法重载不同的是,属性的重载声明实际上并没有声明新的属性,而只是为已有的虚属性提供访问器的具体实现。
虚属性
1. 使用virtual 修饰符声明的属性为虚属性。
2. 虚属性的访问器包括get 访问器和set 访问器,同样也是虚的。
抽象属性
1. 使用abstract 修饰符声明的属性为抽象属性。
2. 抽象属性的访问器也是虚的,而且没有提供访问器的具体实现。这就要求在非虚的派生类中,由派生类自己通过重载属性来提供对访问器的具体实现。
3. abstract 和override 修饰符的同时使用,不但表示属性是抽象的,。而且它重载了基类中的虚属性这时属性的访问器也是抽象的。
4. 抽象属性只允许在抽象类中声明。
5. 除了同时使用abstract 和override 修饰符这种情况之外,static, virtual, override和abstract 修饰符中任意两个不能再同时出现。
密封属性
1. 使用sealed 修饰符声明的属性为密封属性。类的密封属性不允许在派生类中被继承。密封属性的访问器同样也是密封的。
2. 属性声明时如果有sealed 修饰符,同时也必须要有override 修饰符。
从上面可以看出,属性的这些规则与方法十分类似。对于属性的访问器,我们可以把get 访问器看成是一个与属性修饰符相同、没有参数、返回值为属性的值类型的方法,把set 访问器看成是一个与属性修饰符相同、仅含有一个value 参数、返回类型为void 的方法。看下面的程序:
上一页 [1] [2] [3] [4] 下一页 |